我想知道以下内容在性能上是否有区别

SELECT ... FROM ... WHERE someFIELD IN(1,2,3,4)

SELECT ... FROM ... WHERE someFIELD between 0 AND 5

SELECT ... FROM ... WHERE someFIELD = 1 OR someFIELD = 2 OR someFIELD = 3 ... 

或者MySQL会像编译器优化代码一样优化SQL吗?


EDIT

根据评论中说明的原因,将AND改为OR。


当前回答

正如其他人解释的那样,就查询性能而言,选择IN比选择OR更好。

在以下情况下,具有OR条件的查询可能需要更长的执行时间。

执行,如果MySQL优化器选择任何其他索引是有效的(在假阳性的情况下)。 如果记录的数量更多(正如Jacob明确表示的那样)

其他回答

我认为对sunseeker的观察的一个解释是,MySQL实际上对in语句中的值进行排序,如果它们都是静态值,并且使用二进制搜索,这比普通或替代方法更有效。我不记得在哪里读到过,但圣汐者的结果似乎是一个证明。

我知道,只要在Field上有一个索引,BETWEEN就会使用它快速找到一端,然后遍历到另一端。这是最有效的。

我看过的每一个解释都是“IN(…)”和“……”或…”是可互换的,同样有效。这是您所期望的,因为优化器无法知道它们是否包含一个间隔。它也等价于单个值上的UNION ALL SELECT。

我还为未来的谷歌员工做了一个测试。返回的结果总数为7264 / 10000

SELECT * FROM item WHERE id = 1 OR id = 2 ... id = 10000

该查询耗时0.1239秒

SELECT * FROM item WHERE id IN (1,2,3,...10000)

这个查询花费了0.0433秒

IN比OR快3倍

我认为BETWEEN会更快,因为它应该转换为:

Field >= 0 AND Field <= 5

我的理解是,不管怎样,一个IN语句都会被转换成一堆OR语句。IN的价值是易用性。(节省了必须多次键入每个列名,也使它更容易与现有逻辑一起使用-您不必担心and /OR优先级,因为IN是一个语句。对于一堆OR语句,你必须确保用圆括号将它们括起来,以确保它们作为一个条件进行计算。)

对你的问题唯一真正的答案是分析你的查询。然后你就会知道在你的特定情况下什么是最好的。

公认的答案并不能解释原因。

下面引用自高性能MySQL,第三版。

在许多数据库服务器中,In()只是多个OR子句的同义词,因为这两个子句在逻辑上是等价的。在MySQL中不是这样,它对in()列表中的值进行排序,并使用快速的二进制搜索来查看一个值是否在列表中。这是列表大小的O(Log n),而等效的OR子句系列的列表大小是O(n)(即,对于大列表来说要慢得多)