1
我有以下查詢。MySQL在使用IN(SUBQUERY)時忽略索引?
SELECT MIN(col1) FROM table1 WHERE id1 IN (SELECT id2 FROM table2)
這會產生大約需要5秒的輸出。
然而,如果我改變查詢以作爲兩個單獨的查詢的運行,使得:
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_)示例時,由於某種原因,索引也會被刪除。爲什麼是這樣?
這似乎解決了問題。我會盡快批准它。雖然我很好奇爲什麼會發生這種情況。 – Detritus 2012-07-11 10:41:20
首先沒有索引引擎正在做一個全表掃描,這是解決,其次子條目裏面的子句越過要掃描的行數,比如說table1包含100行,table2有100個,使用它會是100 * 100掃描 – 2012-07-11 10:42:53
這些指標是以前存在的。由於某些原因,MySQL只是無視它們。正如你可以看到table2使用它的PRIMARY,table1使用'id1'作爲它的索引。唯一的區別似乎是使用JOIN強制MySQL確認索引'id1'。 – Detritus 2012-07-11 10:46:02