博客
关于我
mysql索引最左匹配原则理解以及常见的sql使用的索引情况的实测
阅读量:788 次
发布时间:2023-02-13

本文共 2114 字,大约阅读时间需要 7 分钟。

一、常见例子

MySQL索引的最左匹配原则主要是针对复合索引(联合索引)而言的。以下是一个典型的例子:假设在字段`a`、`b`、`c`上创建了一个联合索引`index_abc`。

ALTER TABLE `test` ADD INDEX `index_abc`(`a`, `b`, `c`) USING BTREE;

以下是基于该索引的不同查询情况分析:

  • explain select * from test where a<10;

    这种情况下,索引能够有效地帮助优化查询,因为查询的条件仅涉及`a`字段,且`a`是索引的一部分。因此,索引可以被充分利用。

  • explain select * from test where a<10 and b <10;

    在此情况下,索引同样能够发挥作用。因为查询的条件是`a<10 AND b<10`,而索引包含了`a`和`b`字段,优化器可以利用该索引来加快查询速度。

  • explain select * from test where a<10 and b <10 and c<10;

    此时,索引仍然可以被使用。因为查询条件涉及到`a`、`b`和`c`字段,而索引包含了这三个字段,因此优化器可以利用该索引来提高查询效率。

    然而,需要注意的是索引的使用并不总是如此理想。接下来,我们来探讨一些特殊情况。

    1. explain select * from test where b<10 and a <10;

      在这种情况下,索引仍然能够被有效使用。因为查询的条件是`b<10 AND a<10`,而索引包含了`a`和`b`字段,因此优化器会将查询优化为`explain select * from test where a<10 AND b<10`,从而充分发挥索引的作用。

    2. explain select * from test where b<10 and a <10 and c<10;

      在这种情况下,索引同样能够被使用。因为查询的条件是`b<10 AND a<10 AND c<10`,而索引包含了`a`、`b`和`c`字段,因此优化器可以利用该索引来提高查询效率。

      接下来,我们来探讨索引使用的边界情况。

      1. explain select * from test where b<10 and c <10;

        在这种情况下,索引无法被充分利用。因为查询的条件是`b<10 AND c<10`,而索引仅包含了`a`、`b`和`c`字段,但查询的条件中未涉及`a`字段,因此索引无法被有效地利用。

      2. explain select * from test where a<10 and c <10;

        在这种情况下,索引仍然能够被部分利用。因为查询的条件是`a<10 AND c<10`,而索引包含了`a`和`c`字段,因此`a`字段可以利用索引,但`c`字段无法充分利用索引。

        1. explain select * from test where a=1001 and c=1003;

          在这种情况下,索引能够部分被利用。因为查询的条件是`a=1001 AND c=1003`,而索引包含了`a`和`c`字段,因此`a`字段可以利用索引,但`c`字段无法充分利用索引。

        2. explain select * from test where c=1003;

          在这种情况下,索引无法被充分利用。因为查询的条件是`c=1003`,而索引仅包含了`a`、`b`和`c`字段,但查询的条件中未涉及`a`和`b`字段,因此索引无法被有效地利用。

        3. explain select * from test where b=1002;

          在这种情况下,索引无法被充分利用。因为查询的条件是`b=1002`,而索引仅包含了`a`、`b`和`c`字段,但查询的条件中未涉及`a`和`c`字段,因此索引无法被有效地利用。

        4. 需要注意的是,在实际应用中,索引的使用还受到查询条件的顺序和是否完全匹配等因素的影响。因此,在实际使用中,建议通过测试来验证索引的有效性。

          二、总结

          基于上述分析,可以总结出以下几点:

        5. 如果在数据库中存在复合索引`index_abc(a, b, c)`,并且查询的条件是`select *`,则只要查询条件中包含`a`字段(无论其在查询中的位置如何),索引就可以被充分利用。这种情况下,索引能够显著提升查询效率。
        6. 如果查询的条件是`select *`,并且`a`字段是查询条件中的第一个字段(无论其在查询中的具体位置),索引仍然能够被充分利用。这一点适用于所有类型的查询条件,包括`=`、`<`、`>`等。
        7. 如果查询的条件仅涉及`b`或`c`字段,而不涉及`a`字段,则索引无法被充分利用。这是因为索引的主要作用在于快速定位记录,而仅涉及`b`或`c`字段的查询无法充分利用索引带来的优势。
        8. 需要注意的是,上述结论仅在查询的条件是`select *`且索引存在的情况下成立。如果查询的条件不是`select *`,则索引的使用情况可能会有所不同。因此,在实际应用中,建议根据具体的查询需求来设计和使用索引。

          三、参考链接

  • 转载地址:http://sadfk.baihongyu.com/

    你可能感兴趣的文章
    mysql手工注入
    查看>>
    MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
    查看>>
    Mysql执行update by id的过程
    查看>>
    mysql执行计划
    查看>>
    MySQL执行计划 EXPLAIN参数
    查看>>
    MySQL执行计划【explain】,看这一篇就够啦!
    查看>>
    Mysql执行计划字段解释
    查看>>
    mysql执行计划怎么看
    查看>>
    MySQL执行计划解读
    查看>>
    mysql执行顺序与索引算法
    查看>>
    mysql批量update优化_Mysql中,21个写SQL的好习惯,你值得拥有呀
    查看>>
    mysql批量update操作时出现锁表
    查看>>
    MYSQL批量UPDATE的两种方式
    查看>>
    mysql批量修改字段名(列名)
    查看>>
    MySQL批量插入数据遇到错误1213的解决方法
    查看>>
    mysql技能梳理
    查看>>
    MySQL报Got an error reading communication packets错
    查看>>
    Mysql报错Can‘t create/write to file ‘/tmp/#sql_3a8_0.MYD‘ (Errcode: 28 - No space left on device)
    查看>>
    MySql报错Deadlock found when trying to get lock; try restarting transaction 的问题解决
    查看>>
    MySQL报错ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘
    查看>>