据我所知,如果使用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
- 然后它不
提前感谢您的帮助。
答案 0 :(得分:3)
什么决定了IN
表达式中的值来自何处?可能是用户输入,或应该在某个地方的某个地方的东西。应该在表中的事物的示例包括硬编码的查找值。甚至用户输入也可以先插入到某个表中。然后你可以使用JOIN
而不是IN
,你的索引就可以了。
答案 1 :(得分:2)
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)进入您的查询,看看它是否解决了您的问题。