MySQLでデータベースまたはテーブルのインデックスを確認するにはどうすればよいですか?


486

データベースにインデックスがあるかどうかを確認するにはどうすればよいですか?

特定のテーブルについてはどうですか?


ただ使用してください:sp_helpindex 'table name'
user3772443

"ちょうど使用:sp_helpindex 'table name'"これは、MySQLではなくSQL Server(MSSQL)@ user3772443になるように継ぎ合わせる
Raymond Nijland

回答:


794

特定のテーブルのインデックスを表示するには、SHOW INDEXを使用します。

SHOW INDEX FROM yourtable;

特定のスキーマ内のすべてのテーブルのインデックスを表示するには、INFORMATION_SCHEMAのSTATISTICSテーブルを使用できます。

SELECT DISTINCT
    TABLE_NAME,
    INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_schema';

where句を削除すると、すべてのスキーマのすべてのインデックスが表示されます。


10
このDISTINCTキーワードは一部のインデックスをマスクすることに注意してください。同じ名前のテーブルが2つの異なる列で使用されているため、ここの情報スキーマの例では1つのインデックスのみが表示されます。
ベン

from mydbLiorKの答えに示されているように、追加する必要がありました。
2014

@Mark Byersインデックステーブル自体を確認する方法はありますか?SQLは内部でどのようにインデックスファイルを生成しますか?インデックステーブルからメインテーブルへのレコードのポインターをどのように格納しますか?
yajant b

そのため、私のテーブルはINFORMATION_SCHEMA.STATISTICSに表示されますが、index_nameという1つのエントリしかありません。列名を示す追加のエントリはありません。他のすべてのテーブルには、次のようなものを示す複数のエントリがあります。PRIMARYc1、c2 c1、c2が複合主キーを構成します。なぜか?
Stevers

56

すべてのデータベースのすべてのインデックスを一度に表示したい場合:

use information_schema;
SELECT * FROM statistics;

4
ワンライナーとして:SELECT * FROM information_schema.statistics;
enharmonic


7

このクエリを使用して、指定されたデータベース内の各テーブルのインデックス名とインデックスの数を取得できます。

SELECT TABLE_NAME,
       COUNT(1) index_count,
       GROUP_CONCAT(DISTINCT(index_name) SEPARATOR ',\n ') indexes
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'mydb'
      AND INDEX_NAME != 'primary'
GROUP BY TABLE_NAME
ORDER BY COUNT(1) DESC;

5

私はこのクエリを提案します:

SELECT DISTINCT s.*
FROM INFORMATION_SCHEMA.STATISTICS s
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS t 
    ON t.TABLE_SCHEMA = s.TABLE_SCHEMA 
       AND t.TABLE_NAME = s.TABLE_NAME
       AND s.INDEX_NAME = t.CONSTRAINT_NAME 
WHERE 0 = 0
      AND t.CONSTRAINT_NAME IS NULL
      AND s.TABLE_SCHEMA = 'YOUR_SCHEMA_SAMPLE';

すべてのインデックスのみのインデックスが見つかりました。

よろしく。


3

シーケンスの順序で1つの列のインデックスごとにすべてのインデックス付き列を取得します。

SELECT table_name AS `Table`,
       index_name AS `Index`,
       GROUP_CONCAT(column_name ORDER BY seq_in_index) AS `Columns`
FROM information_schema.statistics
WHERE table_schema = 'sakila'
GROUP BY 1,2;

参照:http : //blog.9minutesnooze.com/mysql-information-schema-indexes/


2

dbで無効になっているすべてのインデックスを確認するには

SELECT INDEX_SCHEMA, COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'mydb'
AND COMMENT = 'disabled'

2

MySQLワークベンチでインデックスを確認できます。パフォーマンスレポートのタブで、システムで使用されているすべてのインデックスと未使用のインデックスを確認できます。または、クエリを実行できます。

select * from sys.schema_index_statistics;

Paulどのツールを使用していますか?このコードはmysql workbeanchで機能します。
Ganesh Giri 2017年

MySQLシェルで使用しました
Paul Basenko

Mysql Workbenchを使用してこれを試すことができますか。select * from sys.schema_index_statistics;
Ganesh Giri 2017年

2

これは、インデックス付きフィールドの対応するテーブルでテーブル名と列名を取得するために私の場合に機能します。

SELECT TABLE_NAME , COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'database_name';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.