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

pr1*_*001 16 mysql sql between

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

SELECT * FROM `theTable` WHERE `id` IN (n, ... nk); 
Run Code Online (Sandbox Code Playgroud)

和:

SELECT * FROM `theTable` WHERE `id` BETWEEN n AND nk;
Run Code Online (Sandbox Code Playgroud)

And*_*mar 13

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.


Luk*_*der 13

BETWEEN 超越IN在此情况下(但测量和检查执行计划,也!),尤其是n成长和统计数据仍然准确.我们假设:

  • m 是你的桌子的大小
  • n 是你的范围的大小

可以使用索引(与之n相比很小m)

  • 理论上,BETWEEN可以在主键索引上使用单个"范围扫描"(Oracle说)实现,然后遍历大多数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)是数据库可以将IN列表优化为散列映射而不是谓词列表.