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

t3irkdon  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(288)

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

bttbmeg0

bttbmeg01#

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 因此,可以说,“表范围扫描”是“索引范围扫描”
“唯一键查找”和“非唯一键查找”的不同之处在于,唯一键查找可以在找到1行(或没有行)后停止,而非唯一键查找必须继续进行,直到遇到不匹配的值(或 LIMIT 已到达)。

ibrsph3r

ibrsph3r2#

我认为大部分是语义学。两者非常相似。
索引范围扫描从查找开始。在某些情况下,这就足够了。例如;
求最大值或最小值。
如果已知索引 unique 比较是相等的(或 is null ).
一般来说,引擎会继续扫描索引,直到键值发生变化(对于 = 比较)或直到范围结束。

相关问题