首页 > 数据库 >MySQL 索引的最左前缀匹配原则是什么?

MySQL 索引的最左前缀匹配原则是什么?

时间:2024-12-14 22:44:32浏览次数:4  
标签:匹配 前缀 查询 索引 MySQL WHERE LIKE

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,WHERE,LIKE
From: https://www.cnblogs.com/eiffelzero/p/18607363

相关文章

  • MySQL 的覆盖索引是什么?
    MySQL的覆盖索引是什么?覆盖索引(CoveringIndex)是指索引本身包含了查询所需的所有字段数据,从而无需再回表查询的数据访问方式。这种优化能够显著提升查询性能。1.覆盖索引的特点查询所涉及的字段都在索引中能够找到。不需要访问表的聚簇索引或主键索引即可满足查询。在一......
  • MySQL 的索引下推是什么?
    MySQL的索引下推是什么?索引下推(IndexConditionPushdown,ICP)是MySQL优化器在InnoDB存储引擎中引入的一种查询优化技术,从MySQL5.6开始支持。它的目的是通过将部分查询条件“下推”到存储引擎层,在扫描索引时就进行过滤,减少数据的回表次数,提升查询性能。1.索引下推的原......
  • MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?
    MySQLInnoDB引擎中的聚簇索引和非聚簇索引的区别在MySQL的InnoDB存储引擎中,聚簇索引和非聚簇索引是两种常见的索引类型,它们在数据存储结构和使用场景上有显著区别。1.聚簇索引(ClusteredIndex)特点数据和索引存储在一起:InnoDB表的主键索引是聚簇索引,数据行存储在......
  • MySQL 中的回表是什么?
    MySQL中的回表回表是MySQL查询优化中的一个概念,指的是在使用非聚簇索引查询时,无法直接从索引中获取所需的所有数据,需要通过非聚簇索引查找到主键值,然后再去聚簇索引中根据主键值获取完整数据行的过程。1.回表的触发条件使用了非聚簇索引(也称二级索引、辅助索引)。查询的......
  • 【重生之我在B站学MySQL】
    MySQL笔记文章目录MySQL的三层结构SQL语句分类sql语句数据库操作创建数据库查看、删除数据库表操作创建表mysql常用数据类型(列类型)查询表、插入值创建表练习创建一个员工表emp修改表mysql约束primarykey(主键)notnull(非空)unique(唯一)foreignkey(外键)check......
  • MySQL 的存储引擎有哪些?它们之间有什么区别?
    MySQL的存储引擎及其区别MySQL提供多种存储引擎,不同存储引擎在数据存储方式、索引支持、事务处理等方面各具特点。以下列出常用的存储引擎及其主要区别。1.常见存储引擎(1)InnoDB特点:默认存储引擎,支持事务(ACID)。使用聚簇索引,主键数据和索引存储在一起。支持外键约束。......
  • MySQL 的索引类型有哪些?
    MySQL的索引类型MySQL提供多种索引类型,用于优化数据查询性能。每种索引类型在存储结构、适用场景和性能特性方面各不相同。1.常见的索引类型(1)B+树索引结构:基于B+树实现,是MySQL中最常见的索引类型。特点:索引节点按照键值从小到大顺序排列。叶子节点之间通过指针连......
  • MySQL中这14个神仙功能,惊艳到我了!!!
    大家好,我是苏三,又跟大家见面了。前言我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。1.group_concat在我们平常的工作中,使用groupby进行分组的场景,是非常多的。比如想统计出用户表中,名称不同的用户的具体名称有哪些?......
  • 第4章 Doris数据库与表设计-四种Doris索引的详细使用
    4.4.1表索引概述从加速的查询和原理来看,ApacheDoris的索引分为点查索引和跳数索引两大类。(1)点查索引:常用于加速点查,原理是通过索引定位到满足WHERE条件的有哪些行,直接读取那些行。点查索引在满足条件的行比较少时效果很好。ApacheDoris的点查索引包括前缀索引和倒排......
  • 数据库查询性能优化-正确使用索引避免全表扫描
    优化查询最重要的就是,尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询。具体要注意的:1.应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描。如:selectidfromtwherenumisnull可以在num上设置默认值0,确保表中num列没......