MySQL的联合索引及案例分析

1. 联合索引

关于联合索引的详解参考博客【Mysql-----联合索引和最左匹配】,包含讲解

  • 最左匹配

  • 联合索引失效的情况

    • 不遵循最左匹配原则
    • 范围查询右边失效原理
    • like索引失效原理

比较关注的点在于:

对A、B、C三个字段创建一个联合索引(A, B, C),若where条件后是以下几种情况会不会走索引?

select A, B, C, D from t_a where A=1 and B=1 and C=1;	-- 走索引
select A, B, C, D from t_a where A=1 and B=1;	-- 走索引
select A, B, C, D from t_a where A=1 and C=1 and B=1;	-- 走索引,MySQL有优化器会自动调整A,B,C的顺序与索引顺序一致
select A, B, C, D from t_a where C=1 and B=1 and A=1;	-- 走索引
select A, B, C, D from t_a where B=1 and C=1;	-- 不走索引select A, B, C, D from t_a where A=1 and B>1 and C=1;	-- A、B走索引,C不走索引,因为前面是范围查询
select A, B, C, D from t_a where A>1 and B=1;	-- A走索引,B不走索引select A, B, C, D from t_a where A like 'wan%';	-- 有时能走索引
select A, B, C, D from t_a where A like '%wan%';	-- 必然不走索引
select A, B, C, D from t_a where A like '%wan';	-- 必然不走索引

2. 案例分析

2.1 问题重现:

要执行如下的删除逻辑,<where>标签中只有codeis_deleted一定不为空。

假设dish表有上百万的数据量,delete from ...执行效率低,若不建立合适的索引,容易产生锁表问题,执行报错!

    <delete id="deleteOldData">delete from dish<where><if test="param.code != null and param.code != ''">and code = #{param.code}</if><if test="param.status != null and param.status != ''">and status = #{param.status}</if><if test="param.updateUser != null and param.updateUser != ''">and update_user = #{updateUser}</if><if test="param.isDeleted != null and param.isDeleted != ''">and is_deleted = #{isDeleted}</if></where></delete>

2.2 建立索引:

上述SQL的where条件中,只有两项一定不为空,我们该如何建立合适的索引避免死锁问题?

根据上述章节对联合索引的介绍,我们可以考虑建立如下索引:

CREATE INDEX IDX_DISH_CODE_ISDELETED ON dish(`code`, `is_deleted`, `update_user`, `status`);

把两个一定不为空的字段codeis_deleted放在左侧,且区分度大的字段code放在最左侧,其他两个可能为空的字段放在右侧。

由于联合索引会帮助我们给where条件后的字段重排序,这样至少该delete from where...的前两个字段会走索引,效率提升,降低锁表风险。

未创建该索引时,表索引和执行计划情况:

在这里插入图片描述
在这里插入图片描述

创建该索引后,表索引和执行计划情况:

在这里插入图片描述

(1)字段齐全:

执行这段SQL:

EXPLAIN SELECT * FROM dish WHERE CODE = '123412341234' AND STATUS = '1' AND update_user = '1' AND is_deleted = '0';
-- mysql会帮助调整字段顺序为:
SELECT * FROM dish WHERE CODE = '123412341234' AND is_deleted = '0' AND update_user = '1' AND STATUS = '1';

查看执行计划:

在这里插入图片描述

(2)缺失update_user

执行这段SQL:

EXPLAIN SELECT * FROM dish WHERE CODE = '123412341234' AND STATUS = '1' AND is_deleted = '0';
-- mysql会帮助调整字段顺序为:
SELECT * FROM dish WHERE CODE = '123412341234' AND is_deleted = '0' AND STATUS = '1';

查看执行计划:

在这里插入图片描述

结论:

创建联合索引时,将不为空的、区分度大的字段放在左侧,MySQL会帮助我们调整where条件后的字段顺序,使其尽可能地走索引,提升效率。

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

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

相关文章

数据结构之归并排序算法【图文详解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

FY-SA-20237·8-ZombieFires

Translated from the Scientific American, July/August 2023 issue. Zombie Fires &#xff08;僵尸火灾&#xff09; “Zombie Fires”&#xff08;僵尸火灾&#xff09;是指在地下或地表深处燃烧的火灾&#xff0c;通常在冬季或早春的时候被扑灭&#xff0c;然后在夏季再次…

idea实用快捷键(持续更新...)

文章目录 1、快速输入try/catch/finally2、选中多个光标3、实现接口4、方法参数提示5、查看某个类的子类6、弹出显示查找内容的搜索框 1、快速输入try/catch/finally CtrlAltT 2、选中多个光标 ShiftAlt单机多选 End可以全部到行尾&#xff0c;Home则可以全部回到行首 3、实现接…

Hadoop3:MapReduce源码解读之Mapper阶段的FileInputFormat的切片原理(2)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Mapper阶段的Job任务提交流程&#xff08;1&#xff09; 4、FileInputFormat切片源码解析 切片入口 获取切片 获取切片最大的Size和切片最小的Size 判断文…

可燃气体报警器效检:预防事故,守护家园

在现代化工业生产、居民生活中&#xff0c;可燃气体报警器作为安全预防的重要工具&#xff0c;其准确性和可靠性直接关系到人们的生命财产安全。 因此&#xff0c;对可燃气体报警器进行定期效检&#xff0c;确保其处于最佳工作状态&#xff0c;是保障安全生产的必要措施。 接…

打开C# 大门:Hallo, World!

C# 介绍 C#&#xff08;C Sharp&#xff09;是一种面向对象的编程语言&#xff0c;由微软公司开发。它是 .NET Framework 的一部分&#xff0c;用于构建 Windows 应用程序、Web 应用程序、移动应用程序等。C# 语言的设计目标是简单、现代化、易于学习和使用。在本文中&#xf…

GLM-4已经“低调”开源了

GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。 在语义、数学、推理、代码和知识等多方面的数据集测评中&#xff0c;GLM-4-9B 及其人类偏好对齐的版本 GLM-4-9B-Chat 均表现出较高的性能。 除了能进行多轮对话&#xff0c;GLM-4-9B-Chat 还具备网页浏…

stm32 Systick定时器的配置

从原理上来说&#xff0c;Systick定时器和开发板上的通用定时器没有区别。从功能上来说&#xff0c;Systick定时器主要是用来用来进行延时的&#xff0c;而通用或者高级定时器往往用来进行PWM输出、输入捕获等功能。至于为什么不用通用定时器或者高级定时器来完成延时功能&…

Nginx02-Nginx虚拟主机介绍、日志介绍、Location规则介绍

目录 写在前面NginxNginx处理用户请求流程虚拟主机虚拟主机的分类基于域名的虚拟主机基于端口的虚拟主机基于IP的虚拟主机 Nginx日志错误日志案例 访问日志访问格式变量案例 Location规则案例1案例2Location规则小结 写在前面 这是Nginx第二篇&#xff0c;内容为Nginx处理用户请…

电阻、电容和电感测试仪设计

在现代化生产、学习、实验当中,往往需要对某个元器件的具体参数进行测量,在这之中万用表以其简单易用,功耗低等优点被大多数人所选择使用。然而万用表有一定的局限性,比如:不能够测量电感,而且容量稍大的电容也显得无能为力。所以制作一个简单易用的电抗元器件测量仪是很…

QT之动态加载树节点(QTreeWidget)

之前写过一篇动态加载ComboBox&#xff0c;可参见下面这篇文章 QT之动态加载下拉框&#xff08;QComboBox&#xff09; 同理QTreeWidget也可以实现动态加载&#xff0c;在一些异步加载数据&#xff0c;并且数据加载比较耗时&#xff0c;非常实用。 效果 原理分析 要实现此类效…

【全开源】多功能投票小程序系统源码(ThinkPHP+FastAdmin+Uniapp)

&#x1f680; 多功能投票小程序&#xff0c;让决策变得更简单&#xff01; 基于ThinkPHPFastAdminUniapp开发的多功能系统&#xff0c;支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c…

PlantUML-使用文本来画时序图

介绍 PlantUML 是一个开源工具&#xff0c;用户可以使用纯文本描述来创建 UML (统一建模语言) 图形。由于它使用文本来描述图形&#xff0c;因此可以很容易地将这些描述与源代码一起存储在版本控制系统中。然后&#xff0c;PlantUML 负责将这些描述转换为图形。 资料 官方文…

工业通讯现场中关于EtherCAT转TCPIP网关的现场应用

在当今工业自动化的浪潮中&#xff0c;EtherCAT技术以其高效、实时的特性成为了众多制造业的首选。然而&#xff0c;随着工业互联网的发展&#xff0c;对于数据的远程访问和云平台集成的需求日益增长&#xff0c;这就需要将EtherCAT协议转化为更为通用的TCP/IP协议。于是开疆智…

基础面试题

目录 MySql 1.连接查询 2.聚合函数 3.SQL 关键字 1.分页 (Iimit) 2.倒序 (order by) 3.分组 (group by) 4.去重 (distinct) 4. SQL Select 语句完整的执行顺序: 5. ★数据库三范式 6. 存储引擎 7.★数据库事务 7.1. ★事务特性: ACID 7.2. ★事务隔离级别 8.★…

《web应用技术》第十次作业

将自己的项目改造为基于vue-cli脚手架的项目&#xff0c;页面有导航&#xff0c;学会使用router。 <el-aside width"200px" style"background-color: aliceblue;"> <el-menu :default-openeds"[1]" style"background-color:rgb(1…

【数据结构】排序(直接插入、折半插入、希尔排序、快排、冒泡、选择、堆排序、归并排序、基数排序)

目录 排序一、插入排序1.直接插入排序2.折半插入排序3.希尔排序 二、交换排序1.快速排序2.冒泡排序 三、选择排序1. 简单选择排序2. 堆排序3. 树排序 四、归并排序(2-路归并排序)五、基数排序1. 桶排序&#xff08;适合元素关键字值集合并不大&#xff09;2. 基数排序基数排序的…

电风扇如何实现跌倒断电保护功能

电风扇作为日常生活中常用的家电产品&#xff0c;为了提升安全性能&#xff0c;在设计上通常会考虑加入跌倒断电保护功能。其中&#xff0c;光电倾倒开关是实现跌倒断电保护功能的关键组件之一。 光电倾倒开关内置红外发光二极管和光敏接收器&#xff0c;其工作原理非常巧妙。…

MySQL之查询性能优化(六)

查询性能优化 查询优化器 9.等值传播 如果两个列的值通过等式关联&#xff0c;那么MySQL能够把其中一个列的WHERE条件传递到另一列上。例如&#xff0c;我们看下面的查询: mysql> SELECT film.film_id FROM film-> INNER JOIN film_actor USING(film_id)-> WHERE f…

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱 在大数据处理和分析的场景中&#xff0c;Hadoop MapReduce是一种常见且高效的工具。本文将展示如何使用Hadoop MapReduce来分析邮件日志&#xff0c;提取邮件的发送状态&#xff08;成功、失败或退回&#xff09;和…