インデックスは非常に役立ちます。それらがないと、MySQLはテーブル全体をスキャンして関連する行と列を見つける必要があり、大規模なデータベースでは非常に非効率になる可能性があります。
このチュートリアルでは、MySQLでSHOWINDEXES句を使用してインデックス情報を表示する方法に焦点を当てます。
テーブルインデックスを表示する
テーブルにインデックス情報を表示するには、SHOW INDEXES句を使用し、その後にインデックス情報を取得するテーブルの名前を続けます。
一般的な構文は次のように表示されます。
インデックスを表示tbl_name;
たとえば、Sakilaサンプルデータベースのテーブルの1つについて考えてみます。以下のクエリに示すように、インデックス情報を取得できます。
sakilaを使用します。映画からインデックスを表示します。
上記のクエリは、Sakilaデータベースのフィルムテーブルからのインデックス情報を表示します。出力は次のとおりです。
インデックス情報を理解する
SHOW INDEXESコマンドは、指定された表の索引に関する関連情報を表示します。
以下の用語とそれぞれの情報が提供されます。
- テーブル: これは、出力の最初の列です。インデックスが存在するテーブルの名前が表示されます。
- 非固有: 2番目の列は、インデックスに重複を含めることができるかどうかを示します。値はブール値であり、1はインデックスに重複を含めることができることを示し、そうでない場合は0を示します。
- Key_name: 3番目の列は、インデックスの名前を示しています。慣例により、主キーはPRIMARYのインデックス名を取ります。
- Seq_in_index: 4番目の列には、値1から始まるインデックスの列シーケンス番号が表示されます。
- Column_name: 5番目の列は単に列名です。
- 照合: 6番目の列は、列がインデックスでどのようにソートされるかを示すセクションです。 3つの並べ替え値があり、Aは昇順、Bは降順、NULLは並べ替えられていないことを示します。
- カーディナリティ: 7番目の列は、データ値の一意性を示しています。インデックスでは、特定のインデックスの一意の値の推定数が表示されます。
- Sub_part: 8番目の列には、列全体にインデックスが付けられていることを示すNULLのインデックスプレフィックスが表示されます。
- パック: 9番目の列は、インデックスキーがどのようにパックされているかを示し、NULLはキーがパックされていないことを示します。
- ヌル: 10番目の列は、列にNULL値を含めることができるかどうかを指定します。はい、列にnull値を含めることができる場合ははい、含まない場合は空にします。
- Index_type: 11列目は、BTREE、HASH、RTREE、FULLTEXTなどのインデックスメソッドを示しています。
- コメント: 12番目の列には、その列に記述されていないインデックスに関する情報が表示されます。
- Index_comment: 13番目の列には、作成時にCOMMENT属性を使用して指定された索引に関する追加情報が表示されます。
- 見える: 14番目の列は、クエリオプティマイザに表示されるインデックスで、値は「はい」と「いいえ」です。
- 表現: 15番目の列は、インデックスが列または列プレフィックス値ではなく式を使用している場合に表示されます。
ヒント: SHOW INDEXESクエリからのインデックスに関する情報は、SQLStatisticsの情報と似ています。
スキーマインデックスを表示する
スキーマに関するインデックス情報を取得することもできます。この結果を達成するための一般的な構文は次のとおりです。
SELECT table_name、index_name FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = schema_name;Sakilaスキーマに関する情報を示す以下のクエリについて考えてみます。
SELECT table_name、index_name FROM information_schema.statistics WHERE table_schema =「サキラ」;これにより、以下の出力に示すように、Sakilaスキーマのインデックスに関する情報が表示されます。
+ --------------- + ----------------------------- +|TABLE_NAME|INDEX_NAME|
+ --------------- + ----------------------------- +
|俳優|主要な|
|俳優|idx_actor_last_name|
|住所|主要な|
|住所|idx_fk_city_id|
|住所|idx_location|
|カテゴリー|主要な|
|市|主要な|
|市|idx_fk_country_id|
|国|主要な|
|お客様|主要な|
|お客様|idx_fk_store_id|
|お客様|idx_fk_address_id|
|お客様|idx_last_name|
|映画|主要な|
|映画|idx_title|
|映画|idx_fk_language_id|
|映画|idx_fk_original_language_id|
|film_actor|主要な|
|film_actor|主要な|
|film_actor|idx_fk_film_id|
|film_category|主要な|
|film_category|主要な|
|film_category|fk_film_category_category|
|film_text|主要な|
|film_text|idx_title_description|
|film_text|idx_title_description|
|在庫|主要な|
|在庫|idx_fk_film_id|
|在庫|idx_store_id_film_id|
|在庫|idx_store_id_film_id|
|-----------------------------出力が切り捨てられました------------------- -------
以下に示すクエリを使用して、サーバー内のすべてのスキーマから情報を取得することもできます。
SELECT table_name、index_name FROM information_schema.statistics;ノート :上記のクエリは多くの情報をダンプします。すべてのスキーマからインデックスを取得する必要があることはめったにありません。ただし、出力例は次のとおりです。
+ -------------------- + ------------ +|TABLE_NAME|INDEX_NAME|
+ -------------------- + ------------ +
|innodb_table_stats|主要な|
|innodb_table_stats|主要な|
|innodb_index_stats|主要な|
|innodb_index_stats|主要な|
|innodb_index_stats|主要な|
+ -------------------- + ------------ +
結論
このチュートリアルでは、MySQL SHOWINDEXESクエリを使用してテーブル内のインデックスに関する情報を取得する方法について説明しました。また、information_schemaを使用して、MySQLサーバーの1つまたはすべてのスキーマからインデックスに関する情報を取得することも検討しました。