次のクエリがあります。
SELECT MIN(col1) FROM table1 WHERE id1 IN (SELECT id2 FROM table2)
これにより、最大5秒かかる出力が生成されます。
ただし、次のように2つの別個のクエリとして実行するようにクエリを変更すると、次のようになります。
SELECT id2 FROM table2
SELECT MIN(col1) FROM table1 WHERE id1 IN (_results_from_first_query_)
次に、これにより、約0.05秒かかる出力が生成されます。
EXPLAINは、次のことを示しています(ひどいインデントについてお詫びします)。
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY table1 ALL NULL NULL NULL NULL 1107294 Using where
2 DEPENDENT SUBQUERY table2 eq_ref PRIMARY PRIMARY 16 const,func 1 Using index
vs
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table1 range PRIMARY,id1 id1 8 NULL 12068 Using where
サブクエリを使用するクエリがインデックスを使用しないのはなぜですか?
これに加えて、table2のIDセットのサイズが650を超えると、IN(_results_from_first_query_)の例を実行するときに、何らかの理由でインデックスも削除されます。どうしてこれなの?