BETWENEN和IN与MySQL或SQL之间是否存在性能差异?

时间:2010-07-22 11:24:36

标签: sql mysql between

我想根据主键获得一组连续的行,这是一个自动递增的整数。假设没有漏洞,两者之间是否有任何表现:

SELECT * FROM `theTable` WHERE `id` IN (n, ... nk); 

SELECT * FROM `theTable` WHERE `id` BETWEEN n AND nk;

4 个答案:

答案 0 :(得分:13)

在这种情况下,

BETWEEN 优于IN(但执行衡量并检查执行计划!),尤其是{{1增长,因为统计数据仍然准确。我们假设:

  • n是您表格的大小
  • m是您的范围的大小

可以使用索引(nn相比很小)

  • 理论上,m可以在主键索引上使用单个“范围扫描”(Oracle说)实现,然后遍历大多数BETWEEN索引叶节点。复杂性为n

  • O(n + log m)通常在主键索引上实现为IN“范围扫描”的一系列(循环)。如果n是表的大小,则复杂性始终为m ...这总是更糟(对于非常小的表O(n * log m)或非常小的范围m而言是无效的)

无法使用索引(nn的重要部分)

在任何情况下,您都将获得全表扫描并评估每行的谓词:

  • m需要评估两个谓词:一个用于下限,一个用于上限。复杂性为BETWEEN

  • O(m)需要评估最多IN个谓词。复杂性为n ...如果数据库可以将O(m * n)列表优化为散列映射而不是谓词列表,则可能会更糟,或者可能O(m)

答案 1 :(得分:11)

a between b and c是一个扩展为b <= a and a <= c的宏。

a in (b,c,d)是一个扩展为a=b or a=c or a=d的宏。

假设您的nnk是整数,两者最终都应该相同。 between变体应该快得多,因为它只有两个比较,而nk - n变体的in比较。

答案 2 :(得分:1)

我已经为这个问题做过研究。 我的表中有11M行。我已经对此执行了两个查询:

查询1:SELECT * FROM PLAYERS WHERE SCORE BETWEEN 10 TO 20

查询2:SELECT * FROM PLAYERS WHERE SCORE IN (10,11,...,20)

执行时间,两个查询都翻译为Andomar,如上所述。

在两个查询中,查询1的运行速度比查询2快。

要了解更多信息,请点击此链接:

Performance of BETWEEN VS IN() in MySQL

谢谢。

答案 3 :(得分:0)

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