IN(1,2 ... n)查询优化

时间:2010-03-03 14:17:26

标签: sql optimization mysql

据我所知,如果使用IN(1,2 ... n)查询,mysql不使用索引。我错了吗?或者有什么我可以做的让mysql使用它?我不是指IN()子查询优化,因为这在手册中有清楚的解释。

示例(假设所有字段都有索引,名为index_abc):

WHERE a = 1 AND b = 2 AND c = 3 - 然后它使用index_abc

WHERE a = 2 AND b IN (2, 4, 5) AND C = 3 - 然后它不

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

什么决定了IN表达式中的值来自何处?可能是用户输入,或应该在某个地方的某个地方的东西。应该在表中的事物的示例包括硬编码的查找值。甚至用户输入也可以先插入到某个表中。然后你可以使用JOIN而不是IN,你的索引就可以了。

答案 1 :(得分:2)

在MySQL可以使用索引的所有情况下都会描述

here。我没有看到IN那里。将查询重写为(b = 2 OR b = 4 OR b = 5) AND c = 3,使mysql使用索引。我认为这只是因为mysql不够聪明:)

答案 2 :(得分:1)

我同意乔尔。

尽可能避免使用IN语句。 (在大多数情况下,它们可以由JOINS替换。)使用IN语句是已知的性能缺陷。另请注意,IN语句在(大多数?)数据库上具有最大允许成员数。

答案 3 :(得分:0)

发布您的解释会非常有帮助。尝试添加 FORCE KEY(keyname)进入您的查询,看看它是否解决了您的问题。