MySQL中的最左前缀匹配原则

ops/2024/10/23 11:38:20/

最左前缀匹配原则是 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.ppmy.cn/ops/127809.html

相关文章

Dockerfile 中关于 RUN 的奇怪写法 -- 以 | 开头

在一个大型的官方镜像中 &#xff0c;我通过 docker history --no-trunc <image_id> 看到&#xff0c;该镜像某一步的构建过程是&#xff1a; RUN |3 CUDA_VERSION12.4.1.003 CUDA_DRIVER_VERSION550.54.15 JETPACK_HOST_MOUNTS /bin/sh -c if [ -n "${JETPACK_HOS…

springboot项目多个数据源配置 dblink

当项目中涉及到多个数据库连接的时候该如何处理&#xff1f; 在对应的配置文件&#xff0c;配置对应的数据库情况&#xff0c;不过我确实没咋测试对于事务的处理我可以后续在多做测试 配置文件中配置对应的数据源 然后再使用的时候使用这个 DS(“pd_ob”)注解。 然后又长知识…

安科瑞分布式储能监控系统在晋亿实业5MW分布式储能项目中的应用

文&#xff1a;安科瑞郑桐 摘 要&#xff1a;随着全球能源结构的转型和可再生能源的快速发展&#xff0c;储能技术逐渐成为调节能源供需、提高能源利用效率的关键环节&#xff0c;在这一背景下&#xff0c;分布式储能系统应运而生&#xff0c;成为应对能源不稳定性与波动性的有…

灵当CRM index.php 任意文件上传漏洞复现

0x01 产品描述&#xff1a; 灵当CRM是一款专为中小企业量身定制的智能客户关系管理工具&#xff0c;由上海灵当信息科技有限公司开发和运营。该系统广泛应用于多个行业&#xff0c;包括金融、教育、医疗、IT服务及房地产等领域&#xff0c;旨在满足企业对客户个性化管理的需求&…

React Native 持久化数据

在 React Native 中&#xff0c;持久化数据是指将数据保存在设备上&#xff0c;以便在应用重新启动后仍然可以访问。以下是一些常用的数据持久化方法&#xff1a; AsyncStorage&#xff1a; React Native 提供了 react-native-async-storage/async-storage 库&#xff0c;这是一…

912.排序数组

目录 题目解法步骤 1&#xff1a;调用 randomized_partition步骤 2&#xff1a;递归调用 randomized_quicksort最终结果&#xff1a;变量变化总结&#xff1a; 为什么要把主元放到最后一个&#xff1f;partition返回得到的是什么下标&#xff1f; 题目 给你一个整数数组 nums&…

3d建筑设计效果图渲染平台有哪些?瑞云快图怎么样?

在建筑设计领域&#xff0c;3d建筑设计效果图渲染平台是设计师们不可或缺的工具。这些平台能够帮助设计师们将他们的创意转化为逼真的视觉效果&#xff0c;从而更好地与客户沟通并展示设计理念。 本文将介绍一些常见的3d建筑设计效果图渲染平台&#xff0c;并重点介绍瑞云快图…

【计算机网络 - 基础问题】每日 3 题(五十三)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…