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.
假设你的n和nk是整数,两者最终都意味着相同.该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列表优化为散列映射而不是谓词列表.
| 归档时间: |
|
| 查看次数: |
17391 次 |
| 最近记录: |