MySQL 索引的最左前缀匹配原则

最左前缀匹配原则是 MySQL 使用联合索引时的一个重要优化规则。它指的是在查询条件中,只有符合索引最左侧字段开始的连续前缀部分时,索引才能被有效利用。


1. 最左前缀匹配的含义

  • 联合索引:一个索引包含多个列,如 CREATE INDEX idx_col ON table (a, b, c);
  • 最左前缀:指联合索引中从最左侧开始连续的一个或多个列。

只有查询条件使用了从最左侧开始的列,或者符合从最左侧列开始的部分连续列时,索引才会生效。


2. 示例分析

(1)创建联合索引

假设有如下表结构:

CREATE TABLE users (
id INT PRIMARY KEY,
a INT,
b INT,
c INT,
KEY idx_abc (a, b, c)
);

(2)不同查询条件的索引使用情况

查询条件 最左前缀匹配 是否使用索引
WHERE a = 1 匹配 a
WHERE a = 1 AND b = 2 匹配 a, b
WHERE a = 1 AND b = 2 AND c = 3 匹配 a, b, c
WHERE b = 2 不匹配(未从最左列开始)
WHERE c = 3 不匹配(未从最左列开始)
WHERE b = 2 AND c = 3 不匹配(跳过了 a)

3. 索引前缀的灵活性

(1)范围查询对索引的影响

  • 范围条件(如 <, >, BETWEEN, LIKE 等)会中断最左前缀匹配后续列的索引使用。

示例:

SELECT * FROM users WHERE a = 1 AND b > 2 AND c = 3;
  • 分析

    • a = 1b > 2 满足索引 a, b 的最左前缀匹配。
    • 但由于 b > 2 是范围查询,c = 3 无法继续利用索引。

(2)LIKE 模式匹配

  • 如果 LIKE 以通配符(如 %)开头,会破坏索引匹配。

示例:

SELECT * FROM users WHERE a LIKE '1%' AND b = 2;
  • a LIKE '1%' 可以使用索引。
SELECT * FROM users WHERE a LIKE '%1' AND b = 2;
  • a LIKE '%1' 无法使用索引。

4. 优化查询以符合最左前缀匹配

  1. 调整查询条件顺序

    • 确保条件从联合索引的最左列开始,并连续覆盖。
  2. 避免跳列

    • 联合索引的中间列不能跳过,否则后续列的索引无法使用。
  3. 分解查询

    • 将无法利用索引的查询分解成可以利用索引的多次查询。

5. 总结

  • 原则:联合索引必须从最左列开始匹配,且列之间连续。
  • 范围条件的影响:范围条件会阻断后续列的索引使用。
  • 优化建议:根据最左前缀匹配原则设计查询条件,确保索引能够高效利用。

理解和遵循最左前缀匹配原则,是使用 MySQL 联合索引优化查询性能的关键。

MySQL 索引的最左前缀匹配原则是什么?的更多相关文章

  1. 关于MySQL索引的最左前缀匹配原则原理说明说明

    假设有2个这样的SQL SELECT * FROM table WHERE a = 1 AND c = 3; // c不走索引 SELECT * FROM table WHERE a = 1 AND ...

  2. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

    面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...

  3. mysql 最左前缀匹配原则

    1.在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:对列col1.列col2和列col3建一个联合索引 KEY index_col1_co ...

  4. MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序

    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序   What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构. 索引可以让我们避免一行一行进行全表扫描.它的 ...

  5. MySQL 的索引和最左前缀原则

    这两天看<构建高性能Web站点>这本书,感觉写的真是不错,很多实际项目中会碰到的问题都有所提及,今天看到一个最左前缀原则,以前也听说过,不过一直没搞明白,今天查了下. 通过实例理解单列索引 ...

  6. mysql多列索引和最左前缀

    数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度.索引优化是数据库优化的最重要手段. 如果查询语句使用 ...

  7. mysql索引之一:索引基础(B-Tree索引、哈希索引、聚簇索引、全文(Full-text)索引区别)(唯一索引、最左前缀索引、前缀索引、多列索引)

    没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储10 ...

  8. mysql索引之四:复合索引之最左前缀原理,索引选择性,索引优化策略之前缀索引

    高效使用索引的首要条件是知道什么样的查询会使用到索引,这个问题和B+Tree中的“最左前缀原理”有关,下面通过例子说明最左前缀原理. 一.最左前缀索引 这里先说一下联合索引的概念.MySQL中的索引可 ...

  9. Mysql联合索引的最左前缀原则以及b+tree

    软件版本mysql5.7 根据官网的文档 https://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html 查询条件要符合最左原 ...

  10. MySQL的索引类型和左前缀索引

    1.索引类型: 1.1B-tree索引: 注:名叫btree索引,大的方面看,都用的是平衡树,但具体的实现上,各引擎稍有不同,比如,严格的说,NDB引擎,使用的是T-tree,但是在MyISAM,In ...

随机推荐

  1. 「NOIP2024」 树上查询

    update 2024/12/28 题目描述 给定一棵树,每次询问区间 \([l,r]\) 的 \[\max_{l \le l' \le r' \le r \land r' - l' + 1 \ge ...

  2. Win10部分软件程序中输入中文变成问号??如何处理【详细步骤】

    近期在win10系统中,出现了一个问题,那就是在部分程序软件中输入中文之后,会直接显示问号,哪怕是更换输入法也没有任何用.那么遇到这个问题,我们要如何处理呢?下面IT百科分享一下Win10系统部分软件 ...

  3. linux--安装zeppelin

    可以下载源码安装也可以用docker安装 http://zeppelin.apache.org/download.html Zeppelin 安装目录的bin文件夹下,使用以下命令启动进程: /opt ...

  4. 流程控制之switch选择结构

    实现方式:switch case语句 switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支 switch语句中的变量类型可以是: byte.short.int或者cha ...

  5. 最优化算法Nesterov Momentum牛顿动量法

    这是对之前的Momentum的一种改进,大概思路就是,先对参数进行估计,然后使用估计后的参数来计算误差 具体实现: 需要:学习速率 ϵ, 初始参数 θ, 初始速率v, 动量衰减参数α每步迭代过程:

  6. hbase - [05] hbase关联hive

    一.配置 1.在hive的配置文件中配置HBASE_HOME(conf/hive-env.sh) export HBASE_HOME=/opt/module/hbase 2.将 conf/hive-e ...

  7. Deepseek学习随笔(13)--- 清华大学发布第5弹:DeepSeek与AI幻觉(附网盘链接)

    人工智能技术的飞速发展为我们带来了前所未有的便利,但同时也伴随着一个不容忽视的问题--AI幻觉.清华大学发布的<DeepSeek与AI幻觉>详细探讨了AI幻觉的成因.评测方法以及应对策略, ...

  8. 添加xxx.so到环境变量里

    点击查看代码 libxxx.so 文件位于 /usr/local/lib 目录下,你可以按照以下步骤操作: 创建配置文件: echo "/usr/local/lib" | sudo ...

  9. 解密prompt系列50. RL用于优化Agent行为路径的一些思路

    OpenAI新推出的Deep Research功能,属实有些惊艳,也验证了去年的一些观点,之后的大模型工作流会呈现一些截然不同的形态,有敏捷型的例如语音端到端的及时对话,也会有异步长流程的复杂任务,去 ...

  10. 【P3】Logisim搭建单周期MIPS-CPU

    最近在想,我究竟能从计组课程中学到什么.依葫芦画瓢地搭一个CPU不难,但稍微设想一下从无到有设计指令,构建数据通路控制器,再到优化为多周期.流水线,在权衡中各模块互相调节...整个过程复杂困难曲折到令 ...