【MySQL】MySQL索引之最左前缀优化

news2025/2/24 0:15:01

文章目录

  • 一、联合索引
    • 联合索引执行示例
  • 二、索引的 order by优化
    • MySQL中的排序方式
    • 数据准备
    • 无索引
    • 有索引
    • where子句索引字段顺序不一致
    • order by索引字段顺序不一致
    • 索引字段升降序不一致
  • 三、总结

一、联合索引

对主键建立的索引叫做聚簇索引, 对普通字段建立的索引叫做二级索引
多个普通字段组合在一起创建的索引叫做联合索引, 也被称之为组合索引
在创建联合索引时, 需要着重注意多个字段的顺序问题, 因为(a,b,c)和(b,a,c)在使用时会有不同
联合索引的使用需要遵循最左前缀匹配原则, 也就是按照最左优先的方式进行索引的匹配

联合索引执行示例

创建一个(a,b,c)的联合索引, 接下来将会举例可能会遇到的所有情况, 并写出是否会执行索引

Where语句索引是否被使用
where a = 1Y,使用到a
where a = 1 and b = 2Y,使用到a,b
where a = 1 and b = 2 and c = 3Y,使用到a,b,c
where a = 1 and b like ‘kk%’ and c = 3Y,使用到a,b,c
where a = 1 and b like ‘%kk’ and c = 3Y,只用到a
where a = 1 and b like ‘%kk%’ and c = 3Y,只用到a
where a = 1 and b like ‘k%kk%’ and c = 3Y,使用到a,b,c
where a = 1 and c = 3使用到a, 但是c不可以,b中间断了
where a =13 and b > 2 and c = 3使用到a和b, c不能用在范围之后,b断了
where a is null and b is not nullis null 支持索引 但是is not null 不支持,所以 a 可以使用索引,但是 b不一定能用上索引(8.0)
where b = 2 或者 where b = 3 and c = 4 或者 where c = 4N
where a <> 1不能使用索引where abs(a) =1不能使用 索引
where b = 2不能使用 索引where c = 3不能使用 索引
where b = 2 and c = 3不能使用 索引

因为有查询优化器, 所以字段 a在 where子句中的顺序不重要

二、索引的 order by优化

MySQL中的排序方式

在 MySQL中有两种排序方式:

  • Using filesort: 通过表的索引或全表扫描, 读取满足条件的数据行, 然后在排序缓冲区sort buffer中完成排序操作, 所有不是通过索引直接返回排序结果的排序都叫Using filesort
  • Using index: 通过有序索引顺序扫描直接返回有序数据, 这种情况下使用的是Using index, 不需要额外的排序, 操作效率高

很明显, Using index 使用到了索引, 肯定是性能高的, 所以我们在实际使用中尽量将 SQL优化到Using index
接下来我们就测试一下 order by的索引使用

数据准备

测试数据嘛, 肯定是越多越好.准备了一张表, 数据量 2w
角色表:

  • id: 自增长
  • role_name: 随机字符串, 不允许重复
  • orders: 1-1000任意数字
    在这里插入图片描述

无索引

这里我们要使用到explain命令, 也是大家很熟悉的了

explain命令主要用于查看 SQL的执行计划, 该命令可以模拟优化器执行 SQL查询语句

当前我们的role表是没有索引的
在这里插入图片描述

接下来我们会执行以下 SQL语句分别查看没有索引和有索引的情况

explain select * from role order by orders

在这里插入图片描述

此时可以看到, 因为排序所用到的条件orders没有用到索引, 索引会用到排序缓冲区, 也就是把数据读出来, 然后在排序缓冲区进行排序后展示出来

有索引

这个时候我们给role表新增索引

-- 给tb_user中的age和phone创建索引 
-- CREATE INDEZ 索引名 ON 表名(字段名...);
CREATE INDEX or_role ON role(orders,role_name);

在这里插入图片描述

现在我们就创建好需要的索引了, 重新执行一下之前的 SQL语句

explain select * from role order by orders, role_name

这次我们可以看到Extra出现了Using index, 也就代表着我们使用到了索引, 同时需要注意的是, 这次我们使用到了两个排序字段orders和role_name, 也就是我们之前创建的索引, 众所周知, MySQL有自己的执行优化器, where子句索引字段所处的位置无关紧要, 只要使用到了就可以, 那么order by是不是也是这样呢

where子句索引字段顺序不一致

explain select * from role where orders = 500 and role_name like 'a%'

在这里插入图片描述

咱就说, 不知道没关系, 有图有真相

order by索引字段顺序不一致

explain select * from role order by role_name,orders

接下来我们看一下 order by子句字段顺序与索引顺序不一致的情况
在这里插入图片描述

可以看到, 最后还是出现了Using filesort的情况

索引字段升降序不一致

explain select * from role order by orders asc, role_name desc

在这里插入图片描述

我们在使用 order by的时候如果没有指定顺序, 默认都是按照升序排列的, 索引也是这样, 字段默认是升序排列的, 但是当我们查询的时候一个升序, 一个降序, 此时就会出现Using filesort如果想解决这个问题, 我们可以使用下面的 SQL语句在生成索引的时候指定索引的排列顺序

CREATE INDEX or_role ON role(orders asc,role_name desc);

三、总结

当我们使用联合索引的时候, 在where子句中要考虑最左前缀索引是否使用到了, 合理的去创建索引, 因为 MySQL有优化器的存在, 所以在where子句中不用考虑字段的顺序问题但是在order by使用联合索引的时候, 要考虑order by字段和索引顺序是否一致, 排序规则和索引是否一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux实操篇---常用的基本命令1(跟文件操作相关的命令)

一、常用的基本命令 1.常用的shell命令 Shell可以看作是一个命令解释器&#xff0c;为我们提供了交互式的文本控制台界面。 目前的发行版本&#xff1a;在bin/sh 最早的版本Unix&#xff1a;Bourne shell—>Bourne Again Shell 取了 B A Sh。因此目前Linux的发行版大多数…

PieCloudDB Database 与多家基础架构软件厂商完成产品兼容性认证

数据库作为数字经济建设的重要基础&#xff0c;扮演着产业数字化和数据价值释放的基石角色。然而&#xff0c;数据库的发展不能仅仅依赖于自身的技术和创新&#xff0c;也需要建立一个良好的生态系统&#xff0c;与各方合作共同推进数据库技术的进步与创新。 拓数派&#xff08…

港联证券|受两大消息刺激,美最大太阳能公司股价创十年最大日涨幅

因两大利好消息&#xff0c;美国第一太阳能公司&#xff08;FirstSolar&#xff0c;下称第一太阳能&#xff09;股价大涨。 5月12日&#xff0c;第一太阳能宣布&#xff0c;拟最高支付8000万美元收购瑞典钙钛矿企业Evolar AB。其中包括交易完成时支付3800万美元&#xff0c;以及…

SpringSecurity-从入门到精通学习笔记

SpringSecurity从入门到精通 课程介绍 0. 简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。…

基于qt5的应用程序在windows和linux环境下修改图标及制定后缀关联

基于qt5的应用程序在windows和linux环境下修改图标及制定后缀关联 1、windows 1.1 修改应用程序图标 方式一&#xff1a; 使用qmake来生成makefile文件&#xff0c;只需要在.pro中添加&#xff1a; RC_ICONS logo.ico 然后&#xff0c;重新生成makefile文件和应用程序&…

MySQL学习---15、流程控制、游标

1、流程控制 解决复杂问题不可能是通过一个SQL语句完成&#xff0c;我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序&#xff0c;是我们完成复杂操作必不可少的一部分。只要是执行的程序&#xff0c;流程就分为三大类&#xff1a; 1、顺序结…

MMM(Master-Master replication manager for MySQL)

MMM&#xff08;Master-Master replication manager for MySQL&#xff0c;MySQL主主复制管理器&#xff09; 是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发&#xff0c;主要用来监控和管理 MySQL Master-Master &#xff08;双主&#xff09;复制&…

【计算机视觉】CLIP:连接文本和图像(关于CLIP的一些补充说明)

文章目录 一、前言二、背景及相关工作三、方法3.1 Costly datasets3.2 Narrow3.3 Poor real-world performance 四、要点4.1 CLIP is highly efficient4.2 CLIP is flexible and general 五、限制六、更广泛的影响七、结论 一、前言 我们推出了一个名为CLIP的神经网络&#xf…

原神服务端搭建架设教程win系统(附客户端+服务端+环境配置)

原神服务端搭建架设教程win系统(附客户端服务端环境配置) 大家好&#xff0c;我是艾西原神一款开放世界冒险3D游戏以七种元素&#xff08;分别为风、雷、岩、火、水、草、冰&#xff09;交汇的幻想世界“提瓦特”创造的游戏世界&#xff0c;以角色扮演的RPG游戏还是有非常多的玩…

Prompt工程师指南[应用篇]:Prompt应用、ChatGPT|Midjouney Prompt Engineering

Prompt工程师指南[应用篇]&#xff1a;Prompt应用、ChatGPT|Midjouney Prompt Engineering 1.ChatGPT Prompt Engineering 主题&#xff1a; 与 ChatGPT 对话 Python 笔记本 Topics: ChatGPT介绍审查对话任务与ChatGPT对话Python笔记本 ChatGPT介绍 ChatGPT是OpenAI训练的…

(数字图像处理MATLAB+Python)第七章图像锐化-第三节:高斯滤波与边缘检测

文章目录 一&#xff1a;高斯函数&#xff08;1&#xff09;定义&#xff08;2&#xff09;特点 二&#xff1a;LOG算子&#xff08;1&#xff09;定义&#xff08;2&#xff09;程序 三&#xff1a;Canny算子&#xff08;1&#xff09;最优边缘检测&#xff08;2&#xff09;C…

前端开发推荐vscode安装什么插件?

前言 可以参考一下下面我推荐的插件&#xff0c;注意&#xff1a;插件的目的是用于提高开发的效率&#xff0c;节约开发的时间&#xff0c;像类似检查一些bug、拼写错误等这些可以使用插件快速的识别&#xff0c;避免在查找错误上浪费过多的时间&#xff0c;但切记不要过度依赖…

高速电路设计阻抗匹配的几种方法

为什么要阻抗匹配? 在高速数字电路系统中&#xff0c;电路数据传输线上阻抗如果不匹配会引起数据信号反射&#xff0c;造成过冲、下冲和振铃等信号畸变&#xff0c;当然信号沿传输线传播过程当中&#xff0c;如果传输线上各处具有一致的信号传播速度&#xff0c;并且单位长度…

AVL和二叉树介绍

AVL tree介绍 AVL的全称是&#xff1a;Adelson-Velsky-Landis&#xff0c;是发明这种高度平衡二叉树的人名的缩写&#xff0c;AVL tree是一种优化了的搜索二叉树。 这是二叉排序树会存在的一个问题&#xff0c;先看案例: 给定一个数列为{1,2,3,4,5,6}&#xff0c;将这个数列…

【Blender】学习一下

简介Download使用教程入门常识界面简介编辑器视图Layout游标对物体的操作 实战案例1. 萌三兄弟——建模、渲染2. 积木组合——建模、渲染、动画制作3. 金币基站——建模、渲染4. 狂奔的小车——建模、渲染、动画5. 荧光树桩——雕刻、建模、渲染6. 子弹冲击——建模、渲染、动画…

Hum Brain Mapp | 联合连接矩阵独立成分分析:结构和功能连接的自动链接

导读 对人类大脑连接的研究&#xff0c;包括结构连接(SC)和功能连接(FC)&#xff0c;这些方面的研究有助于深入了解大脑功能的神经生理机制及其与人类行为和认知的关系。这两种类型的连接测量都提供了重要且互补的信息。然而&#xff0c;将这两种模式整合到一个单一的框架中仍…

AutoCV番外:Transformer

目录 Transformer前言1. Self-attention1.1 前置知识1.2 Self-attention机制1.3 矩阵乘法角度理解1.4 Multi-head Self-attention1.5 Positional Encoding1.6 Many application 2. Transformer2.1 前置知识2.2 Encoder2.3 AT Decoder2.4 NAT Decoder2.5 Cross attention2.6 Tra…

如何区分比特率、波特率和频谱带宽?

01、什么是比特率和波特率&#xff1f; 宽带网络里面提及的千兆即1000Mbit/s&#xff0c;一般描述的是我们家网络端口每秒最大可接收0、1比特&#xff08;bit&#xff09;的数量&#xff0c;即每秒可接收1000x106个比特。显而易见&#xff0c;比特率越高&#xff0c;每秒传送的…

利用resnet50模型实现车牌识别(Python代码,.ipynb和.py两种文件保存都有,可以使用jupyter或pycharm运行)

1.代码的主要流程如下&#xff1a; 导入所需的库和模块。对数据集进行可视化&#xff0c;随机选择一些图像进行展示。加载图像数据集&#xff0c;并将图像和标签存储在数组中。对标签进行独热编码。划分训练集和测试集。使用图像数据增强技术增加训练数据的多样性。定义一些评…

让ChatGPT成为全科医生的智能助理

医生问诊 医疗健康是所有人都关心的话题。涉及医疗健康领域的信息化事件&#xff0c;无论是搜索引擎推荐和广告信息&#xff0c;还是互联网挂号&#xff0c;或者电子商务在线买药&#xff0c;经常能引发社会性讨论。有了 ChatGPT&#xff0c;我们自然也会期待在医疗健康领域&a…