为什么 mysql 在联合索引中,出现范围查询(<, >),范围查询右侧的列索引失效。可以用>=或者<=来规避索引失效问题。

2023-08-23 12:55:48 +08:00
 rqxiao

按照这个说法 如果 a 的值有 1-99 , 在 a>=1 条件下,只有 a=1 用到 ab 联合索引,2 到 99 只用到了 a 列的索引?

1816 次点击
所在节点    MySQL
5 条回复
rqxiao
2023-08-23 13:17:35 +08:00
一直对 mysql 在联合索引中>=或者<=来规避索引失效这个不是很理解。



范围查询右边失效原理 如果是 ><的情况,可以按照下面这种解释,
举例
select * from t where a>1 and b=2
分析如下:

首先 a 字段在 B+树上是有序的,所以可以用二分查找法定位到 1 ,然后将所有大于 1 的数据取出来,a 可以用到索引。

b 有序的前提是 a 是确定的值,那么现在 a 的值是取大于 1 的,可能有 10 个大于 1 的 a ,也可能有一百个 a 。

大于 1 的 a 那部分的 B+树里,b 字段是无序的(开局一张图),所以 b 不能在无序的 B+树里用二分查找来查询,b 用不到索引。

那为什么>= 就可以用到 a 和 b 列索引了呢
wmz000
2023-08-23 14:08:58 +08:00
应该是 a>=1,b= 2 中的,a=1,b=2 这种会走索引吧,之前研究过,现在忘了,哈哈
xiangyuecn
2023-08-23 15:51:13 +08:00
这种半桶水文章看多了影响智商。直接撸 mysql 官方文档吧。
asmile1993
2023-08-23 15:57:49 +08:00
从哪本书截的图?看这文字描述,我觉得这本书质量不是很高。

1) 假设 Q2 能利用上索引 (a, b),那么由于 a 是范围查询,根据高性能 MySQL 中的知识,可以知道“如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找”, 这里说的无法使用索引优化查找,是指“不能用索引快速定位”,但"快速过滤"是可以做的。

2) 由 1 可知,索引(a, b) 中,只有列 a 能用作索引快速定位,而列 b 不能用来快速定位,但 MySQL 有索引下推优化,因此对于列 b 来说,可以利用 ICP 来达到在索引遍历中快速过滤,从而减少回表次数。

有点没看懂你这个例子的回答,一直说索引有序是什么意思,虽然有关系,但有点答不对题,让人疑惑。
54qyc
2023-08-26 17:26:41 +08:00
OP 可以给个链接吗?图中信息太少了,猜测表达的意思是利用 a = 1 , b = 2 查询到了第一条记录,然后开始往后扫描索引。此时无法直接二分查找了,扫描到的记录发给服务器做 where 过滤。这问题的表述你看是人话吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/967617

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX