2012-07-11 53 views
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_)示例時,由於某種原因,索引也會被刪除。爲什麼是這樣?

回答

1

如何::

創建表1上的ID1和表2爲ID2和查詢的索引應該是::

SELECT MIN(col1) FROM table1 

inner join table2 on id1=id2 
+0

這似乎解決了問題。我會盡快批准它。雖然我很好奇爲什麼會發生這種情況。 – Detritus 2012-07-11 10:41:20

+0

首先沒有索引引擎正在做一個全表掃描,這是解決,其次子條目裏面的子句越過要掃描的行數,比如說table1包含100行,table2有100個,使用它會是100 * 100掃描 – 2012-07-11 10:42:53

+0

這些指標是以前存在的。由於某些原因,MySQL只是無視它們。正如你可以看到table2使用它的PRIMARY,table1使用'id1'作爲它的索引。唯一的區別似乎是使用JOIN強制MySQL確認索引'id1'。 – Detritus 2012-07-11 10:46:02