非唯一键查找和索引范围扫描有啥区别?

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

第二个不能做那样的事情。没有复合索引可以同时处理yb

“索引范围扫描”和“表范围扫描”类似,但适用于不同的BTree。 “表”包含在由PRIMARY KEY 排序的 BTree 中,因此可以说,“表范围扫描”是“索引范围扫描”

“唯一键查找”和“非唯一键查找”的不同之处在于,唯一键可以在找到 1 行(或没有行)后停止,而非唯一键必须继续运行,直到非唯一键查找遇到匹配值(或达到LIMIT)。

【讨论】:

【参考方案2】:

我认为大部分是语义。两者非常相似。

索引范围扫描从查找开始。在某些情况下,这就足够了。比如;

求最大值或最小值。 如果已知索引为 unique 并且比较是相等的(或 is null)。

更一般地说,引擎会继续扫描索引,直到键值更改(用于= 比较)或直到范围结束。

【讨论】:

以上是关于非唯一键查找和索引范围扫描有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 5.0 索引 - 唯一与非唯一

索引和分片有啥区别

MySQL中explain的type类型

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别

Oracle索引总结- Oracle唯一索引普通索引及约束的关系

99.索引-TODO