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