大家在背 mysql 八股文的时候,是不是经常看到这句话。
联合索引的最左匹配原则会一直向右匹配直到遇到范围查询(>、、=、 1 and b = 2,联合索引(a, b)哪一个字段用到了联合索引的 b+tree?
由于联合索引(二级索引)是先按照 a 字段的值排序的,所以符合 a > 1 条件的二级索引记录肯定是相邻的,于是在进行索引扫描的时候,可以定位到符合 a > 1 条件的第一条记录,然后沿着记录所在的链表向后扫描,直到某条记录不符合 a > 1 条件位置。所以 a 字段可以在联合索引的 b+tree 中进行索引查询。
但是在符合 a > 1 条件的二级索引记录的范围里,b 字段的值是无序的。
比如,下图的联合索引的 b+ tree 里:
下面这三条记录的 a 字段的值都符合 a > 1 查询条件,而 b 字段的值是无序的:
a 字段值为 5 的记录,该记录的 b 字段值为 8;
a 字段值为 6 的记录,该记录的 b 字段值为 10;
a 字段值为 7 的记录,该记录的 b 字段值为 5;
因此,我们不能根据查询条件 b = 2 来进一步减少需要扫描的记录数量(b 字段无法利用联合索引进行索引查询的意思)。
所以在执行 q1 这条查询语句的时候,对应的扫描区间是 (2, + ∞),形成该扫描区间的边界条件是 a > 1,与 b = 2 无关。
因此,q1 这条查询语句只有 a 字段用到了联合索引进行索引查询,而 b 字段并没有使用到联合索引。
我们也可以在执行计划中的 key_len 知道这一点,在使用联合索引进行查询的时候,通过 key_len 我们可以知道优化器具体使用了多少个字段的查询条件来形成扫描区间的边界条件。
举例个例子 ,a 和 b 都是 int 类型且不为 null 的字段,那么 q1 这条查询语句执行计划如下:
可以看到 key_len 为 4 字节(如果字段允许为 null,就在字段类型占用的字节数上加 1,也就是 5 字节),说明只有 a 字段用到了联合索引进行索引查询,而且可以看到,即使 b 字段没用到联合索引,key 为 idx_a_b,说明 q1 查询语句使用了 idx_a_b 联合索引。
通过 q1 查询语句我们可以知道,a 字段使用了 > 进行范围查询,联合索引的最左匹配原则在遇到 a 字段的范围查询( >)后就停止匹配了,因此 b 字段并没有使用到联合索引。
例子二
q2: select * from t_table where a >= 1 and b = 2,联合索引(a, b)哪一个字段用到了联合索引的 b+tree?
q2 和 q1 的查询语句很像,唯一的区别就是 a 字段的查询条件「大于等于」。
由于联合索引(二级索引)是先按照 a 字段的值排序的,所以符合 >= 1 条件的二级索引记录肯定是相邻,于是在进行索引扫描的时候,可以定位到符合 >= 1 条件的第一条记录,然后沿着记录所在的链表向后扫描,直到某条记录不符合 a>= 1 条件位置。所以 a 字段可以在联合索引的 b+tree 中进行索引查询。
虽然在符合 a>= 1 条件的二级索引记录的范围里,b 字段的值是「无序」的,但是对于符合 a = 1 的二级索引记录的范围里,b 字段的值是「有序」的(因为对于联合索引,是先按照 a 字段的值排序,然后在 a 字段的值相同的情况下,再按照 b 字段的值进行排序)。
于是,在确定需要扫描的二级索引的范围时,当二级索引记录的 a 字段值为 1 时,可以通过 b = 2 条件减少需要扫描的二级索引记录范围(b 字段可以利用联合索引进行索引查询的意思)。也就是说,从符合 a = 1 and b = 2 条件的第一条记录开始扫描,而不需要从第一个 a 字段值为 1 的记录开始扫描。
所以,q2 这条查询语句 a 和 b 字段都用到了联合索引进行索引查询。
我们也可以在执行计划中的 key_len 知道这一点。执行计划如下:
可以看到 key_len 为 8 字节,说明优化器使用了 2 个字段的查询条件来形成扫描区间的边界条件,也就是 a 和 b 字段都用到了联合索引进行索引查询。
通过 q2 查询语句我们可以知道,虽然 a 字段使用了 >= 进行范围查询,但是联合索引的最左匹配原则并没有在遇到 a 字段的范围查询( >=)后就停止匹配了,b 字段还是可以用到了联合索引的。
例子三
q3: select * from t_table where a between 2 and 8 and b = 2,联合索引(a, b)哪一个字段用到了联合索引的 b+tree?
q3 查询条件中 a between 2 and 8 的意思是查询 a 字段的值在 2 和 8 之间的记录。
不同的数据库对 between ... and 处理方式是有差异的。在 mysql 中,between 包含了 value1 和 value2 边界值,类似于 >= and = and 、、=、<=、between、like 前缀匹配的范围查询,并不会停止匹配。
借鉴海外巨头IIoT转型案例,关注先发优势和高市场渗透率的投资标的
高通CEO带你窥探5G未来10年之路
【紫光同创国产FPGA教程】【第二十八章】USB双向测速例程
M1 MacBook无法禁用电池健康管理功能
一篇文章带您读懂工业机器人的设计过程
联合索引的最左匹配原则
5G手机的普及速度进一步加快 价格战也将提前打响
IBM为新疆农信搭建的全面风险预警信息管理平台已上线
索泰多款显卡荣膺2023年度大奖
变频器在自动卷染机张力控制系统方案
最常见三相异步电机自锁接线图分析
纯电动汽动力总成系统选型匹配计算方法研究
人工智能的发展道路任重而道远
量旋科技宣布完成2000万元A+轮股权投资
无人机空中移动性管理分布式控制框架
芯片通信的革命:世界最小纳米激光发射器问世
5G的商用价值主要体现在哪里
全新的力帆鹏飞SUV新车实车曝光:外观不输哈弗,直接叫板宝骏510!
外媒:iPhone7将迎压力传感技术、双摄像头+双扬声器
Android AudioTrack音频播放分析