一尘不染

使用MySQL或SQL进行的BETWEEN和IN之间的性能差异一般吗?

mysql

我要根据它们的主键获取一组连续的行,这是一个自动递增的整数。假设没有漏洞,那么它们之间是否有任何性能:

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

和:

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

阅读 1416

收藏
2020-05-17

共1个答案

一尘不染

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列表优化为哈希图,而不是谓词列表,则可能更糟。

2020-05-17