MySQL索引最左匹配原则实例详解

yizhihongxing

MySQL索引最左匹配原则是指当我们使用多列索引进行查询时,只有索引的最左边的列才能被用于索引扫描,即只有最左前缀匹配的列会被索引扫描,这是MySQL查询优化的一个重要原则。

具体来说,当使用多列索引进行查询时,MySQL只会使用最左边的列作为索引键进行查找,找到符合条件的最左前缀匹配的行,并返回这些行的主键值;然后在这些行中再进行二次查找,即对最左前缀匹配的所有行进行数据的筛选。这种二次查找也被称为“回表”,即通过主键再次查找具体的数据行。

下面我们通过两个例子来进一步理解最左匹配原则:

例1:

假设我们有如下一张订单表orders,表结构如下:

CREATE TABLE orders (
  id INT PRIMARY KEY,
  user_id INT NOT NULL,
  order_no VARCHAR(50) NOT NULL,
  order_status VARCHAR(20) NOT NULL,
  order_amount DECIMAL(10,2) NOT NULL
);

CREATE INDEX idx_orders_multi ON orders(user_id, order_no, order_status);

可以看到我们在订单表上创建了一个联合索引idx_orders_multi,包含了user_idorder_noorder_status三个字段。

现在我们需要查询用户1001的所有已完成订单的订单号,可以使用如下SQL语句进行查询:

SELECT order_no FROM orders WHERE user_id=1001 AND order_status='Completed';

这个查询语句可以借助索引idx_orders_multi,首先按照user_id字段找到所有用户为1001的订单记录,然后再在这些记录中根据order_status字段完成最后的筛选,返回符合条件的订单号。

需要注意的是,即使order_no字段在索引中排在order_status之后,也可以被用于查询。这是因为在idx_orders_multi索引中,order_noorder_status都是非主键列,当MySQL在使用索引时,会先使用索引键对应的列进行查找,再根据order_noorder_status进行后续筛选。

例2:

现在我们有如下一张用户表users,表结构如下:

CREATE TABLE users (
  id INT PRIMARY KEY,
  username VARCHAR(50) NOT NULL,
  password VARCHAR(50) NOT NULL,
  age INT NOT NULL,
  gender VARCHAR(10) NOT NULL
);

CREATE INDEX idx_users_multi ON users(age, gender, username);

可以看到我们在用户表上创建了一个联合索引idx_users_multi,包含了agegenderusername三个字段。

现在我们需要查询所有年龄为18岁,性别为的用户的用户名和密码,可以使用如下SQL语句进行查询:

SELECT username, password FROM users WHERE age=18 AND gender='Male';

这个查询语句可以借助索引idx_users_multi,首先按照age字段找到所有年龄为18的用户记录,然后再在这些记录中根据gender字段完成最后的筛选,再根据这些记录中的usernamepassword字段返回查询结果。

需要注意的是,即使usernamepassword字段在索引中排在gender之后,也可以被用于查询。这是因为在idx_users_multi索引中,usernamepassword是非主键列,当MySQL在使用索引时,会先使用索引键对应的列进行查找,再根据usernamepassword进行后续筛选。

以上就是关于MySQL索引最左匹配原则的详细介绍,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL索引最左匹配原则实例详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • java微信企业号开发之开发模式的开启

    下面是Java微信企业号开发之开发模式的开启的完整攻略。 一、申请微信企业号 进入微信企业号官网,点击”立即注册”按钮,按照提示完成企业号的注册。 注册成功后,登录微信企业号管理后台,进入”设置”->”开发者中心”,选择”开发者模式”。 二、配置服务器URL 在”开发者模式”中,配置服务器URL。将URL模式选择为”模式二”,填写好Token和Enco…

    database 2023年5月21日
    00
  • JVM 体系结构详解

    JVM 体系结构详解 Java虚拟机(Java Virtual Machine,JVM)是Java语言的核心组成部分,其实现了Java程序跨平台的能力。JVM体系结构包括类加载器、运行时数据区、执行引擎等多个组成部分,下面我们将详细讲解它们的作用及原理。 类加载器 类加载器(ClassLoader)的作用是将Java类的class文件加载到JVM中。JVM中…

    database 2023年5月21日
    00
  • 详细深入聊一聊Mysql中的int(1)和int(11)

    当我们在设计MySQL表时,常常会使用int类型作为列的数据类型,但是int还可以指定长度,比如int(1)和int(11)两种类型。在这里,我们来深入聊一聊它们之间的不同。 int(1)与int(11)的区别 事实上,int(1)和int(11)在存储数据时并没有真正的差异,它们都占据四个字节的存储空间,存储的范围也一样。它们的唯一区别在于,int(1)在…

    database 2023年5月18日
    00
  • 当mysqlbinlog版本与mysql不一致时可能导致出哪些问题

    当mysqlbinlog版本与MySQL版本不匹配时,可能会出现以下问题: 数据丢失或重复如果使用mysqlbinlog恢复MySQL数据时,mysqlbinlog的版本与MySQL服务器不一致,可能会出现数据丢失或重复的问题。这可能会影响到数据的完整性和准确性。 恢复失败如果mysqlbinlog的版本与MySQL服务器不匹配,则有可能出现恢复失败的情况。…

    database 2023年5月22日
    00
  • 深入理解MySQL索引底层数据结构

    在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没有思考过,为什么加了索引就会能提高SQL的查询效率,为什么有时候加了索引SQL执行反而会没有变化,本文就从MySQL索引的底层数据结构和算法来进行详…

    2023年4月8日
    00
  • MySQL root修改普通用户密码

    MySQL是一种流行的关系型数据库管理系统,它被广泛用于各种应用程序中。作为MySQL的管理员,我们需要时常修改普通用户的密码以确保数据库的安全性。 在MySQL中,root用户是拥有最高权限的用户。如果我们需要修改普通用户的密码,那么我们需要使用root用户登录MySQL并进行操作。 下面是MySQL root修改普通用户密码的方法详解: 步骤1:使用ro…

    MySQL 2023年3月10日
    00
  • java.lang.NullPointerException异常问题解决方案

    Java.lang.NullPointerException异常问题解决方案 Java.lang.NullPointerException异常是Java程序员经常遇到的常见问题之一。它通常是由于在应用程序中使用了空引用导致的。本文将为您提供解决Java.lang.NullPointerException异常问题的详细攻略。 原因分析 Null指的是空对象。在…

    database 2023年5月21日
    00
  • mybatis中#{}和${}的区别详解

    下面是针对“Mybatis中#{}和${}的区别详解”的完整攻略: 1. #{}和${}的基本概念 在Mybatis中,#{}和${}都是参数占位符,用于将数据传递到SQL语句中。在执行SQL语句时,#{}会将传入的数据以预编译的形式进行处理,而${}则会将传入的数据直接拼接到SQL语句中。 2. #{}和${}的主要区别 2.1. SQL注入问题 在使用$…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部