我不知道非唯一键查找和索引范围扫描之间有什么区别,因为我认为它们都返回符合运算符“=”o“<”这样条件的行。
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 已到达)。
INDEX(x,b)
x=123 and b=88
x > 123
y
b
PRIMARY KEY
LIMIT
ibrsph3r2#
我认为大部分是语义学。两者非常相似。索引范围扫描从查找开始。在某些情况下,这就足够了。例如;求最大值或最小值。如果已知索引 unique 比较是相等的(或 is null ).一般来说,引擎会继续扫描索引,直到键值发生变化(对于 = 比较)或直到范围结束。
unique
is null
=
2条答案
按热度按时间bttbmeg01#
将扫描x=123的所有行。它的性能与
两者都将深入索引的btree以找到第一个匹配项。然后它将向前扫描,直到值不再匹配。
但是,它们的工作方式不同:
第一个可以利用
INDEX(x,b)
. 它定位第一个x=123 and b=88
,然后扫描到x > 123
.第二个不能做那样的事。没有一个综合指数能同时处理这两个问题
y
以及b
.“索引范围扫描”和“表范围扫描”类似,但适用于不同的btree。“表”包含在由
PRIMARY KEY
因此,可以说,“表范围扫描”是“索引范围扫描”“唯一键查找”和“非唯一键查找”的不同之处在于,唯一键查找可以在找到1行(或没有行)后停止,而非唯一键查找必须继续进行,直到遇到不匹配的值(或
LIMIT
已到达)。ibrsph3r2#
我认为大部分是语义学。两者非常相似。
索引范围扫描从查找开始。在某些情况下,这就足够了。例如;
求最大值或最小值。
如果已知索引
unique
比较是相等的(或is null
).一般来说,引擎会继续扫描索引,直到键值发生变化(对于
=
比较)或直到范围结束。