三十八、【进阶】最左前缀法则

1、理解

        最左前缀法则,如果索引了多列(联合索引),要遵守最左前缀法则,最左前缀法则是致,查询从索引的最左列开始,并且不跳过索引中的列。

        如果跳过某一列,索引将部分失效(该索引后面的字段索引全部失效)。

2、最左前缀法则

(1)案例准备

将使用如下语句来诠释最左前缀法则:

(2)查询表中索引

(3)使用联

        在使用联合索引查询tb_user表时,可以看到可能用到的索引为“idx_user_pro_age_sta”,实际用到的索引也是它,索引的长度为54

explain select * from tb_user where profession='软件工程' and age=31 and status='0';

(4) 缺少部分字段

        为了验证最左前缀法则,再次查询tb_user表,这次只查询两个字段,分别为“profession”和“age”字段,发现依旧使用索引查询,其索引长度为49,可以得到len(status)=54-49=5

(5)缺少部分字段

         再次查询tb_user表,这次只查询一个字段,为“profession”字段,发现依旧使用索引查询,其索引长度为47,可以得到len(age)=49-47=2

(6) 跳过联合索引的第一字段查询

        再次查询tb_user表,这次查询联合索引的第二个字段和第三个字段,可以看到查询类别是“ALL”,表示全表扫描,不走索引。

        这是为什么呢?

        这是因为在使用联合索引时,联合索引最左边的字段必须出现,按顺序依次出现,否则索引查询就会失效。

(7)跳过索引的第一、二字段查询

        再次查询tb_user表,使用字段为“status”字段,可以看到查询方式依旧为“全表扫描”,没有使用索引查询,因为其不符合最左前缀法则。

(8) 不使用联合索引的第二字段查询

        再次查询tb_user表,联合索引查询,使用第一个字段“profession”和第三个字段“status”进行查询,可以看到查询方式为“索引查询”,但注意到,其索引长度为47,在前面的查询中,我们知道字段“profession”的长度为47,可见字段“status”查询并未生效,这是因为查询过程中跳过了第二个字段“age”不符合最左前缀法则

(9) 更换顺序

        在上述案例中,我们比较详细的分析了最左前缀法则,但此时,我们有一个疑问,如果我在使用联合索引查询时,调换了索引的顺序,会不会导致查询失败?

        如上图所示,我们在使用联合索引时,调换了字段的位置,依旧可以使用联合索引查询,这是因为and表示并列关系,并无先后递进关系。

3、范围查询

(1)基本

        在联合索引中,如果出现范围查询(>,<),会导致范围查询右侧的列索引失效。

(2)范围查询导致右边索引失效

(3)解决方案:

        在业务允许的范围内,将<&>改为<=&>=;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弦之森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值