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. 面试题:区分List中remove(int index)和remove(Object obj)

    面试题:区分List中remove(int index)和remove(Object obj) package com.atguigu.exer;import org.junit.Test;impor ...

  2. 3 x 2 + 1 !安 全 能 力 权 威 认 可 !

    近日,由XOps大会组委会主办的"2024第三届XOps产业创新发展论坛"在北京召开.大会主论坛公布了2024上半年XOps最新评估结果,天翼云顺利通过ITU DevOps国际标准 ...

  3. 云电脑:DPU简介及分析

    本文分享自天翼云开发者社区<云电脑:DPU简介及分析>,作者:大利 随着云计算技术的快速发展,云电脑作为一种基于云计算技术的虚拟化电脑,正在逐渐受到广泛关注.然而,云电脑在实现过程中面临着 ...

  4. FLink自定义Sink,生产的数据导出到Redis

    一.pom文件 https://www.cnblogs.com/robots2/p/16048648.html 二.自定义sink 2.1 自定义sink package net.xdclass.cl ...

  5. FLink怎么做压力测试和监控?

    我们一般碰到的压力来自以下几个方面: 一,产生数据流的速度如果过快,而下游的算子消费不过来的话,会产生背压问题.背压的监控可以使用Flink Web UI(localhost:8081)来可视化监控, ...

  6. 使用C#对Godot属性进行改写(其实是覆盖)

    本文地址:https://www.cnblogs.com/oberon-zjt0806/p/14568221.html 背景 我还真没想到C#这个鬼东西还能这么用-- 起初是想通过某种办法改写一下La ...

  7. 解锁DeepSeek深度应用,天翼云GPU云主机强势破局!

    在人工智能重塑世界的当下,一场影响深远的科技变革正在悄然上演,DeepSeek系列模型在诸多领域掀起热潮.企业级AI模型的训练与部署,不仅是技术的角力场,更是决定企业兴衰的生死线.每一次算法的迭代革新 ...

  8. [BZOJ3771] Triple 题解

    <关于贫穷的樵夫拥有 40000 把斧头这件事>. 相当于是多项式乘法,但是得带容斥,具体自己看代码吧. #include<bits/stdc++.h> using names ...

  9. [JXOI2017] 加法 题解

    最小值最大,考虑二分答案,问题转为判断最小值是否能 \(\ge x\). 假如 \(a_i\ge x\),那我们肯定不管:假如 \(a_i<x\),那最好能让选择的区间 \(r\) 值更大,用优 ...

  10. 重生之数据结构与算法----数组&链表

    简介 数据结构的本质,只有两种结构,数组与链表.其它的都是它的衍生与组合 算法的本质就是穷举. 数组 数组可以分为两大类,静态数组与动态数组. 静态数组的本质是一段连续的内存,因为是连续的,所以我们可 ...