MySQL Explain出力の詳細とまとめ
7535 ワード
mysqlは、ネストされたループ接続を使用して、すべてのテーブル接続を実現します.これはmysqlが最初のテーブルの最初の一致レコードを読み出し、2番目のテーブルの一致レコードを見つけ、3番目のテーブルを見つけたことを意味します.n番目のテーブルに一致するレコードは、すべてのテーブルが検索されるまで表示されます.
mysqlは、見つかったフィールドを出力し、テーブルのリストから複数の一致するレコードが存在するまで遡及し、mysqlはこのテーブルから次のレコードを読み続け、次のテーブルで一致するレコードを検索し続け、順番に類推します.
クエリー・タイプの説明:
1.system:このテーブル全体に1行しか記録されていないのはconstタイプの特例です.
2.const:このタイプのテーブルには、条件に一致するデータが最大1行しかありません.クエリーは最初からこのテーブルのデータを読み込みます.一度読み込むだけなのでconstテーブルのクエリー速度は非常に速いです.
例:
3.eq_ref:このタイプは、前のテーブルの各接続行に対して1行のレコードを読み込むだけです.この接続タイプはsystem,constを除いて最も速い接続タイプである.
適用シーン:
1)接続中にプライマリ・キーまたは空でない一意のインデックスを使用できるすべてのカラム.
2)インデックス列は、等しい(=)比較操作に使用されます.比較値は、定数またはこのテーブルを読む前に読み込まれたテーブルのフィールドからなる式です.
例:
4.ref:このタイプは、現在のテーブルから読み込まれたすべてのローがインデックス値に一致し、これらのローが前のテーブルと一致し、新しいロー(combination of rows)に結合されることを示します.インデックスを使用してわずかなローにのみ一致する場合は、この接続も悪くありません.
適用シーン:
1)通常のインデックスの左接頭辞を使用して接続し、同じインデックス値で複数のローを一致させることができます.
2)インデックス列を使用して=,<=>比較操作を行う.
例:
ref_or_null:この接続タイプはrefと似ていますが、mysqlではnull値を含む行を追加する必要があります.この接続最適化は、サブクエリの解決に最もよく使用されます.
例:
その他の接続タイプ:
fulltext:接続に全文インデックスが使用されていることを示します.
未完待機
mysqlは、見つかったフィールドを出力し、テーブルのリストから複数の一致するレコードが存在するまで遡及し、mysqlはこのテーブルから次のレコードを読み続け、次のテーブルで一致するレコードを検索し続け、順番に類推します.
クエリー・タイプの説明:
1.system:このテーブル全体に1行しか記録されていないのはconstタイプの特例です.
2.const:このタイプのテーブルには、条件に一致するデータが最大1行しかありません.クエリーは最初からこのテーブルのデータを読み込みます.一度読み込むだけなのでconstテーブルのクエリー速度は非常に速いです.
例:
SELECT * FROM tbl_name
WHERE primary_key
=1;
SELECT * FROM tbl_name
WHERE primary_key_part1
=1 AND primary_key_part2
=2;
3.eq_ref:このタイプは、前のテーブルの各接続行に対して1行のレコードを読み込むだけです.この接続タイプはsystem,constを除いて最も速い接続タイプである.
適用シーン:
1)接続中にプライマリ・キーまたは空でない一意のインデックスを使用できるすべてのカラム.
2)インデックス列は、等しい(=)比較操作に使用されます.比較値は、定数またはこのテーブルを読む前に読み込まれたテーブルのフィールドからなる式です.
例:
SELECT * FROM ref_table
,other_table
WHERE ref_table
.key_column
=other_table
.column
;
SELECT * FROM ref_table
,other_table
WHERE ref_table
.key_column_part1
=other_table
.column
AND ref_table
.key_column_part2
=1;
4.ref:このタイプは、現在のテーブルから読み込まれたすべてのローがインデックス値に一致し、これらのローが前のテーブルと一致し、新しいロー(combination of rows)に結合されることを示します.インデックスを使用してわずかなローにのみ一致する場合は、この接続も悪くありません.
適用シーン:
1)通常のインデックスの左接頭辞を使用して接続し、同じインデックス値で複数のローを一致させることができます.
2)インデックス列を使用して=,<=>比較操作を行う.
例:
SELECT * FROM ref_table
WHERE key_column
=expr
;
SELECT * FROM ref_table
,other_table
WHERE ref_table
.key_column
=other_table
.column
;
SELECT * FROM ref_table
,other_table
WHERE ref_table
.key_column_part1
=other_table
.column
AND ref_table
.key_column_part2
=1;
5. ref_or_null:この接続タイプはrefと似ていますが、mysqlではnull値を含む行を追加する必要があります.この接続最適化は、サブクエリの解決に最もよく使用されます.
例:
SELECT * FROM ref_table
WHERE key_column
=expr
OR key_column
IS NULL;
その他の接続タイプ:
fulltext:接続に全文インデックスが使用されていることを示します.
未完待機