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

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。


当前回答

我还为未来的谷歌员工做了一个测试。返回的结果总数为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倍

其他回答

根据我对编译器优化这些类型查询的方式的理解,使用IN子句比多个OR子句更有效。如果您有可以使用BETWEEN子句的值,那么仍然更有效。

OR是最慢的。IN还是BETWEEN更快取决于你的数据,但我希望BETWEEN通常更快,因为它可以简单地从索引中获取一个范围(假设someField被索引)。

2018: IN(…)更快。但是>= && <=比IN还要快。

这是我的基准。

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

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

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

我还为未来的谷歌员工做了一个测试。返回的结果总数为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倍