MySQL Explain出力の詳細とまとめ

7535 ワード

mysqlは、ネストされたループ接続を使用して、すべてのテーブル接続を実現します.これはmysqlが最初のテーブルの最初の一致レコードを読み出し、2番目のテーブルの一致レコードを見つけ、3番目のテーブルを見つけたことを意味します.n番目のテーブルに一致するレコードは、すべてのテーブルが検索されるまで表示されます.
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:接続に全文インデックスが使用されていることを示します.
未完待機