我想根据主键获得一组连续的行,这是一个自动递增的整数。假设没有漏洞,两者之间是否有任何表现:
SELECT * FROM `theTable` WHERE `id` IN (n, ... nk);
和
SELECT * FROM `theTable` WHERE `id` BETWEEN n AND nk;
答案 0 :(得分:13)
BETWEEN
应优于IN
(但执行衡量并检查执行计划!),尤其是{{1增长,因为统计数据仍然准确。我们假设:
n
是您表格的大小m
是您的范围的大小n
与n
相比很小)理论上,m
可以在主键索引上使用单个“范围扫描”(Oracle说)实现,然后遍历大多数BETWEEN
索引叶节点。复杂性为n
O(n + log m)
通常在主键索引上实现为IN
“范围扫描”的一系列(循环)。如果n
是表的大小,则复杂性始终为m
...这总是更糟(对于非常小的表O(n * log m)
或非常小的范围m
而言是无效的)
n
是n
的重要部分)在任何情况下,您都将获得全表扫描并评估每行的谓词:
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
的宏。
假设您的n
和nk
是整数,两者最终都应该相同。 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)(即,大列表的速度要慢得多)