按照这个说法 如果 a 的值有 1-99 , 在 a>=1 条件下,只有 a=1 用到 ab 联合索引,2 到 99 只用到了 a 列的索引?
1
rqxiao OP 一直对 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 列索引了呢 |
2
wmz000 2023-08-23 14:08:58 +08:00
应该是 a>=1,b= 2 中的,a=1,b=2 这种会走索引吧,之前研究过,现在忘了,哈哈
|
3
xiangyuecn 2023-08-23 15:51:13 +08:00
这种半桶水文章看多了影响智商。直接撸 mysql 官方文档吧。
|
4
asmile1993 2023-08-23 15:57:49 +08:00
从哪本书截的图?看这文字描述,我觉得这本书质量不是很高。
1) 假设 Q2 能利用上索引 (a, b),那么由于 a 是范围查询,根据高性能 MySQL 中的知识,可以知道“如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找”, 这里说的无法使用索引优化查找,是指“不能用索引快速定位”,但"快速过滤"是可以做的。 2) 由 1 可知,索引(a, b) 中,只有列 a 能用作索引快速定位,而列 b 不能用来快速定位,但 MySQL 有索引下推优化,因此对于列 b 来说,可以利用 ICP 来达到在索引遍历中快速过滤,从而减少回表次数。 有点没看懂你这个例子的回答,一直说索引有序是什么意思,虽然有关系,但有点答不对题,让人疑惑。 |
5
54qyc 2023-08-26 17:26:41 +08:00
OP 可以给个链接吗?图中信息太少了,猜测表达的意思是利用 a = 1 , b = 2 查询到了第一条记录,然后开始往后扫描索引。此时无法直接二分查找了,扫描到的记录发给服务器做 where 过滤。这问题的表述你看是人话吗?
|