当前位置: 首页 > article >正文

MySQL中的最左前缀匹配原则

最左前缀匹配原则是 MySQL 在使用索引时遵循的一种规则,尤其在涉及到组合索引(联合索引)时。

最左前缀匹配原则指的是在使用组合索引时,MySQL 会从最左边的索引列开始匹配,直到遇到第一个无法继续匹配的列为止。这意味着,如果你想使用组合索引来加速查询,你的查询条件必须遵循 “最左前缀” 的要求,即必须从组合索引最左边的字段开始匹配,逐步向右,不能跳过任何列。


在MySQL中,我们可以为多个字段创建组合索引,例如:

CREATE INDEX idx_user ON users (first_name, last_name, age);

我们为 users 表创建了一个组合索引 idx_user,包含了三个列:first_namelast_nameage。这个索引可以帮助加快查询速度,但是遵循最左前缀匹配的规则,具体体现在以下几个方面:

  1. 完全匹配最左前缀:当你查询条件完全包含最左边的字段,MySQL可以使用这个索引。例如:

    SELECT * FROM users WHERE first_name = 'John';
    

    在这种情况下,查询完全匹配索引中的第一个字段 first_name,因此可以使用 idx_user 索引。

  2. 匹配多个最左前缀的字段:如果查询条件包含索引中前面多个字段,那么MySQL也会使用索引。例如:

    SELECT * FROM users WHERE first_name = 'John' AND last_name = 'Doe';
    

    这时,查询匹配了 first_namelast_name,MySQL仍然可以使用组合索引 idx_user

  3. 部分前缀匹配:如果查询条件只匹配索引的前几个字段中的一部分,MySQL仍然可以利用索引。例如:

    SELECT * FROM users WHERE first_name = 'John' AND age = 25;
    

    在这种情况下,由于中间的 last_name 被跳过了(而 first_name 后面直接是 age),索引无法很好地工作,只能利用 first_name 的部分匹配部分,而不会利用 age

继续以 users 表和组合索引 (first_name, last_name, age) 为例,看看不同的查询能否使用索引:

  1. 可以使用索引:

    SELECT * FROM users WHERE first_name = 'Alice';
    
    • 只使用了第一个字段,符合最左前缀原则。
    SELECT * FROM users WHERE first_name = 'Alice' AND last_name = 'Smith';
    
    • 使用了前两个字段,符合最左前缀原则。
    SELECT * FROM users WHERE first_name = 'Alice' AND last_name = 'Smith' AND age = 30;
    
    • 使用了所有字段,符合最左前缀原则。
  2. 不能使用索引:

    SELECT * FROM users WHERE last_name = 'Smith';
    
    • last_name 不是最左前缀的第一个字段,MySQL不会使用索引 idx_user
    SELECT * FROM users WHERE age = 30;
    
    • age 不是最左前缀的第一个字段,同样不会使用组合索引。
  3. 部分使用索引:

    SELECT * FROM users WHERE first_name = 'Alice' AND age = 30;
    
    • 这里查询中间跳过了 last_name,只会对 first_name 部分使用索引,而无法有效地对 age 进行索引加速。

LIKE 查询

在进行 LIKE 查询时,最左前缀原则也同样适用。例如,对于一个索引 (first_name)

  • 查询 SELECT * FROM users WHERE first_name LIKE 'A%' 会利用索引,因为查询从最左边开始匹配。
  • SELECT * FROM users WHERE first_name LIKE '%A' 则无法利用索引,因为它并不是从最左边匹配,而是存在前缀通配符。

覆盖索引

在某些情况下,使用最左前缀匹配还可以带来覆盖索引的好处。当所查询的字段全部包含在组合索引中时,MySQL 可以直接通过索引获取结果,而不需要访问数据行。这种现象称为覆盖索引(Covering Index),它可以极大地提高查询效率。例如:

SELECT first_name, last_name FROM users WHERE first_name = 'Alice' AND last_name = 'Smith';

在这个查询中,所有被查询的字段都在索引中,所以可以直接从索引中获取这些数据,而不需要再回到表中读取数据行。


http://www.kler.cn/news/362215.html

相关文章:

  • Build an Android project and get a `.apk` file on a Debian 11 command line
  • 删除本地文件不影响Github
  • Elasticsearch文档操作
  • Rust语法基础
  • 演示:基于WPF的DrawingVisual开发的高刷新率示波器
  • jetson nano ubuntu20.04安装ros-Noetic
  • docker加速镜像
  • 论文阅读(二十四):SA-Net: Shuffle Attention for Deep Convolutional Neural Networks
  • linux系统下载安装nvidia显卡驱动
  • Qml的使用
  • Unity加载界面制作
  • Docker:安装 Syslog-ng 的技术指南
  • Build an Android project and get a `.apk` file on a Debian 11 command line
  • Java项目-基于Springboot的车辆充电桩项目(源码+说明).zip
  • c++基础算法练习(1)
  • Android SELinux——调试工具audio2allow介绍(十三)
  • Linux系列-Linux的常见指令(三)
  • 错误0x80070522:客户端没有所需的特权
  • C++ set和map的模拟实现
  • 在Debian上安装向日葵
  • 深度学习-卷积神经网络-基于VGG16模型, 实现猫狗二分类(文末附带数据集下载链接, 长期有效)
  • oracle_查询建表语句
  • 【毕业设计】基于SpringBoot的网上商城系统
  • 【C语言刷力扣】2006.差的绝对值为K的数对数目
  • CTFHUB技能树之SQL——布尔盲注
  • 前端模块化技术 IIFE、CMD、UMD