2012-07-11 59 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