首页 > 解决方案 > 非唯一键查找和索引范围扫描有什么区别?

问题描述

我不知道非唯一键查找和索引范围扫描之间有什么区别,因为我认为它们都返回遵循运算符“=”o“<”之类的条件的行。

标签: mysqlsqldatabasequery-optimization

解决方案


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。“表”包含在按顺序排序的 BTree 中PRIMARY KEY,可以说,“表范围扫描”是“索引范围扫描”

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


推荐阅读