非唯一键查找和索引范围扫描有啥区别?
Posted
技术标签:
【中文标题】非唯一键查找和索引范围扫描有啥区别?【英文标题】:What's the difference between non-unique key lookup and index range scan?非唯一键查找和索引范围扫描有什么区别? 【发布时间】:2020-06-01 22:25:22 【问题描述】:我不知道非唯一键查找和索引范围扫描之间有什么区别,因为我认为它们都返回遵循运算符“=”o“
【问题讨论】:
它们对应不同的搜索操作。您提出问题的背景是什么? 【参考方案1】:WHERE x = 123 -- with INDEX(x)
将扫描 x=123 的所有行。它的性能与
相同WHERE y BETWEEN 22 and 33 -- with any kind of index on y
两者都将向下钻取索引的 BTree 以找到第一个匹配项。然后它将向前扫描,直到该值不再匹配。
但是,它们的工作方式不同:
WHERE x = 123 AND b >= 88
WHERE y BETWEEN 22 and 33 AND b >= 88
第一个可以利用INDEX(x,b)
。它找到第一个x=123 and b=88
,然后扫描到x > 123
。
第二个不能做那样的事情。没有复合索引可以同时处理y
和b
。
“索引范围扫描”和“表范围扫描”类似,但适用于不同的BTree。 “表”包含在由PRIMARY KEY
排序的 BTree 中,因此可以说,“表范围扫描”是“索引范围扫描”
“唯一键查找”和“非唯一键查找”的不同之处在于,唯一键可以在找到 1 行(或没有行)后停止,而非唯一键必须继续运行,直到非唯一键查找遇到匹配值(或达到LIMIT
)。
【讨论】:
【参考方案2】:我认为大部分是语义。两者非常相似。
索引范围扫描从查找开始。在某些情况下,这就足够了。比如;
求最大值或最小值。 如果已知索引为unique
并且比较是相等的(或 is null
)。
更一般地说,引擎会继续扫描索引,直到键值更改(用于=
比较)或直到范围结束。
【讨论】:
以上是关于非唯一键查找和索引范围扫描有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别