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.rhkb.cn/news/454955.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kebuadm部署k8s集群

官方文档: Installing kubeadm | Kubernetes 切记要关闭防⽕墙、selinux、禁用交换空间, cpu核⼼数⾄少为2 内存4G kubeadm部署k8s⾼可用集群的官方文档: Creating Highly Available Clusters with kubeadm | Kubernetes 你需要在每台…

Docker 安装Postgres和PostGIS,并制作镜像

1. 查找postgres和postgis现有的镜像和版本号 镜像搜索网站:https://docker.aityp.com/ 测试使用的是postgres:15.4 和 postgis:15-3.4 2、镜像拉取 docker pull postgres:15.4docker pull postgis/postgis:15-3.4镜像下载完成,docker images 查看如…

konvajs -基础图形-标签-箭头,动画,学习笔记

官网: Konva 框架概述 |Konva - JavaScript 2d 画布 图书馆 (konvajs.org)https://konvajs.org/docs/overview.html konva是canvas的一个库,可快速画出想要的图形。 基础创建步骤: // 第一步,创建一个Stage舞台 var stage new…

element设置时间和日期框早于现在的时间和日期禁用

效果: 今日此时此刻之前的日期、时间禁止选用,切换日期和时间为“2024-10-19 00:00:00",再切换为”2024-10-18 00:00:00"时, 会给form.time默认赋值为今日此时此刻(日期时间少于今日此时此刻则重新赋值) 安…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go? 简单好记的关键词和语法;更高的效率;生态强大;语法检查严格,安全性高;严格的依赖管理, go mod 命令;强大的编译检查、严格的编码规范和完整的…

【优选算法】探索双指针之美(一):双指针与单调性的完美邂逅

文章目录 前言:1.盛水最多的容器2.有效三角形个数3. 和为s的两个数字4. 三数之和5. 四数之和 最后想说: 前言: 在上一章中我们已经认识到了双指针,在这章里我们就来探索一下当双指针和单调性遇见后会擦出怎样的火花呢&#xff1f…

几何算法系列:空间实体体积计算公式推导

1.前言 面积和体积的计算是常见和基础的几何算法话题,面积和体积通常作为面或构件的基本信息参与相关的建模、计算、分析等过程。 有关面积的计算,可以参考博主此前的文章, 一种误差较小的轮廓面积计算算法_轮廓面积计算原理-CSDN博客文章…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

Apple 新品发布会亮点有哪些 | Swift 周报 issue 61

文章目录 前言新闻和社区苹果据称正洽谈投资 OpenAI 英伟达也有意跟投消息称苹果公司服务部门将裁员约百人,波及 Apple Books / Apple News 等业务苹果拟 9 月 10 日举行今年最重磅新品发布会,iPhone 16 亮相?都有哪些看点? 提案正…

京东笔试题

和谐敏感词 🔗 题目地址 🎉 模拟 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();String s scanner.next();String[] words new String[…

【Spring篇】Spring中的Bean管理

🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯Spring IOC容器 &#x1f6a…

如何开启华为交换机 http

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

kafka自定义配置信息踩坑

org.apache.kafka.common.config.ConfigException: Invalid value 0 for configuration acks: Expected value to be a string, but it was a java.lang.Integer 场景描述: 单个kafka使用springboot框架自带的 yml 配置完全OK(因为底层会帮我们处理好类…

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知,QGraphicsView,QGraphicsScene, QGraphicsItem,分别称为:视图,场景,图元,图表就是各种各样的元素,图片元素,线条元…

排序算法 —— 归并排序(理论+代码)

目录 1.归并排序的认识 归并排序的思想 归并排序动图演示 2.归并排序的递归实现 归并排序的遍历方式 归并排序的归并流程 归并排序的递归代码实现 3.归并排序的非递归实现 非递归实现分析 边界分析 非递归实现代码 4.归并排序总结 时间复杂度 空间复杂度 稳定性…

Postman使用-基础篇

前言 本教程将结合业界广为推崇和使用的RestAPI设计典范Github API,详细介绍Postman接口测试工具的使用方法和实战技巧。 在开始这个教程之前,先聊一下为什么接口测试在现软件行业如此重要? 为什么我们要学习Postman? 现代软件…

ubuntu 安装keepalived+haproxy

一、安装keepalived sudo apt update sudo apt install keepalived sudo systemctl start keepalived sudo systemctl enable keepalived sudo systemctl status keepalived#配置Keepalived sudo cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf …

Jmeter 实战 JDBC配置

​ JDBC JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API。通过这个API,可以直接连接并执行SQL脚本,与数据库进行交互。 使用JMeter压力测试时,操作数据库的场景 在使用JMeter进行接口压力测试时…

大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置

大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置 大规模多传感器滑坡检测数据集介绍 数据集概述 名称:大规模多传感器滑坡检测…

R语言建模线性回归

一、 a. # 给定的 (x, y) 数据 x <- c(2, 9, 10, 7) y <- c(3, 13, 12, 11)# 线性回归模型 y a bx model1 <- lm(y ~ x) summary(model1) # 查看回归结果# 提取系数 a 和 b a <- coef(model1)[1] b <- coef(model1)[2]# 预测值 y_pred <- predict(mode…