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


    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)解决方案:

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

  • 相关阅读:
    如何通过Java8新特性Optional类来有效防止空指针异常
    【leetcode】2578.最小和分割
    【Loadrunner】学习loadrunner——性能测试基础篇(一)
    c++ chilkat-9.5.0 库使用CkZipW创建压缩包
    2022年中南大学夏令营面试经验
    python socketserver模块开启ssl双向认证
    GitHub上标星75k+的《Java面试突击版》到底有多牛?看完内容我服了!
    Firefly RK3399 PC pro开发板资料
    【三】Spring Cloud Ribbon 实战
    每天玩手机超过6小时的人,大脑将有什么变化?后来怎样了?
  • 原文地址:https://blog.csdn.net/2301_79149013/article/details/134095769