1

次のクエリがあります。

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_)の例を実行するときに、何らかの理由でインデックスも削除されます。どうしてこれなの?

4

1 に答える 1

1

::はどうですか

id1の場合はtable1に、id2の場合はtable2にインデックスを作成すると、クエリは次のようになります。

SELECT MIN(col1) FROM table1 

inner join table2 on id1=id2
于 2012-07-11T10:34:40.453 に答える