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.mzph.cn/diannao/23107.shtml

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

相关文章

在线建站流程分析

建站流程是指通过互联网创建一个个人或企业网站的过程。随着互联网的发展&#xff0c;越来越多的人和机构开始意识到网络的重要性&#xff0c;建站成为一种常见的行为。在线建站的流程一般包括以下几个步骤。 首先&#xff0c;选择一个合适的建站平台。目前&#xff0c;有很多在…

前端逆向之查看接口调用栈

一、来源 再分析前端请求接口数据的时候&#xff0c;其中有一个sid不知道是前端如何获取的&#xff0c;一般情况下只需要全局搜搜sid这个字符串或者请求接口的名称就可以了&#xff0c;基本都能找到sid的来源&#xff0c;但是今天这个不一样&#xff0c;搜什么都搜不到 接口地…

面试题------>MySQL!!!

一、连接查询 ①&#xff1a;左连接left join &#xff08;小表在左&#xff0c;大表在右&#xff09; ②&#xff1a;右连接right join&#xff08;小表在右&#xff0c;大表在左&#xff09; 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…

AI论文工具推荐

AI 在学术界的使用情况也比较疯狂&#xff0c;特别是一些美国大学&#xff0c;用 AI 来辅助阅读文献以及辅助写论文的越来越多&#xff0c;毕竟确实可以提高写作效率&#xff0c;特别是在文献综述和初稿生成方面。 但在科研界其实&#xff0c;发现看论文的速度已经赶不上发论文…

“粘土风格”轻松拿捏,基于函数计算部署 ComfyUI实现AI生图

阿里云函数计算 FC 一键部署火爆全球工作流 AI 生图平台—— ComfyUI &#xff0c;实现更高质量的图像生成&#xff0c;三步轻松完成“黏土”创意AI画作&#xff0c;晒图赢眼部按摩器等好礼&#xff01; 活动地址&#xff1a; https://developer.aliyun.com/topic/june/fcspma…

编写备份MySQL 脚本

目录 环境准备 增量备份 增量备份和差异备份 完整代码如下 测试脚本是否正常 星期天运行脚本&#xff08;完全备份&#xff09; 星期一运备份脚本&#xff08;增量备份&#xff09; 星期二备份数据&#xff08;其他天--增量备份&#xff09; 星期三备份数据&#xff08;差异备…

【强烈推荐】四元数与三维旋转

目录 1 强烈推荐讲解四元数与三维旋转的这篇文章&#xff0c;深入浅出2 笔记2.1 复数2.1.1 复数的定义2.1.2 复数的乘法与二维旋转 2.2 三维空间中的旋转2.2.1 角轴2.2.2 旋转的分解 2.3 四元数2.3.1 四元数的定义2.3.2 四元数的乘法2.3.3 四元数与三维旋转2.3.4 三维旋转的矩阵…

数字影像产业园的三大赋能:科技、创新与无限可能

数字影像产业园作为文创产业的重要载体&#xff0c;以科技为核心驱动力&#xff0c;不断推动产业的技术革新和升级。 园区内汇聚了最前沿的数字技术资源&#xff0c;高清摄影设备、虚拟现实技术、人工智能应用等尖端科技在这里得到广泛应用&#xff0c;不仅提升了生产效率&…

能源SCI期刊,中科院4区,审稿快,IF=3.858

一、期刊名称 Frontiers in Energy Research 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;能源 影响因子&#xff1a;3.858 中科院分区&#xff1a;4区 三、期刊征稿范围 能源研究前沿出版了整个领域的严格同行评审研究&#xff0c;重点是可持续和环境…

java多线程原理

1.线程创建与启动&#xff1a;通过继承Thread类或实现Runnable接口创建线程&#xff0c;并调用start()方法启动线程。 1.线程状态&#xff1a;线程在其生命周期中有多种状态&#xff0c;包括新建、运行、阻塞、死亡等。了解这些状态以及如何在它们之间转换对于管理线程至关重要…

ICLR 2024 BACKDOOR FEDERATED LEARNING BY POISONING BACKDOOR-CRITICAL LAYERS

寻找后门攻击最有效的网络层。现有的 FL 攻击和防御方法通常关注整个模型。 他们都没有认识到后门关键&#xff08;BC&#xff09;层的存在——控制模型漏洞的一小部分层。 攻击 BC 层可达到与攻击整个模型相同的效果&#xff0c;但被最先进 (SOTA) 防御检测到的机会要小得多。…

如何卸载360安全卫士

不用像其他教程那么复杂 这篇教程比较友好 1.打开桌面&#xff0c;右键单击快捷方式 选择“打开文件位置” 2.然后&#xff0c;搜uninst.exe 3.运行 4.选择“继续卸载” 5.选择“下一步” 6.选择 “继续卸载” 7.选择“继续卸载” 8.选择“是” 9.静等卸载 10.把卸载程序关…

【因果推断python】16_工具变量2

目录 出生季度和教育对工资的影响 第一阶段 出生季度和教育对工资的影响 到目前为止&#xff0c;我们一直将这些工具视为一些神奇的变量 Z&#xff0c;它们具有仅通过干预变量影响结果的神奇特性。老实说&#xff0c;好的工具变量来之不易&#xff0c;我们不妨将它们视为奇迹…

Windows11系统 和Android 调试桥(Android Debug Bridge,ADB)工具安装,app抓取日志内容

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Android调试桥&#xff08;ADB&#xff09;是一种多功能命令行工具&#xff0c;它允许开发者与连接到计算机上的Android设备进行通信和控制。ADB工具的作用包括但不限于&#xff1a; 安装和卸载应用程序&…

2024年先进材料与清洁能源国际会议(ICAMCE 2024)

2024 International Conference on Advanced Materials and Clean Energy 【1】大会信息 大会时间&#xff1a;2024-07-15 大会地点&#xff1a;中国三亚 截稿时间&#xff1a;2024-07-01(以官网为准&#xff09; 审稿通知&#xff1a;投稿后2-3日内通知 投稿邮箱&#xff1a…

揭秘相似矩阵:机器学习算法中的隐形“纽带”

在机器学习领域&#xff0c;数据的处理和分析至关重要。如何有效地从复杂的数据集中提取有价值的信息&#xff0c;是每一个机器学习研究者都在努力探索的问题。相似矩阵&#xff0c;作为衡量数据之间相似性的数学工具&#xff0c;在机器学习算法中扮演着不可或缺的角色。 相似矩…

Docker之路(三)docker安装nginx实现对springboot项目的负载均衡

Docker之路&#xff08;三&#xff09;dockernginxspringboot负载均衡 前言&#xff1a;一、安装docker二、安装nginx三、准备好我们的springboot项目四、将springboot项目分别build成docker镜像五、配置nginx并且启动六、nginx的负载均衡策略七、nginx的常用属性八、总结 前言…

SpringBoot高手之路02-全局异常处理器

RestControllerAdvice 可以将响应数据返回json格式然后响应 那么开始做全局异常处理器 首先先定义一个类 package com.healer.exception;import com.healer.common.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.we…

高并发系统限流原理

短时间内巨大的访问流量&#xff0c;我们如何让系统在处理高并发的同时还能保证自身系统的稳定性&#xff1f;估计有人会说&#xff0c;增加机器就可以了&#xff0c;因为我的系统架构设计就是按照分布式思想进行架构设计的&#xff0c;所以可以只需要增加机器就可以解决问题了…

在Unity中配置Android项目以允许HTTP流量,解决AVPro在Android平台中无法播放http视频

解决方法快速通道&#xff1a;拉到底&#xff0c;看倒数第二张图 好记性不如烂笔头 最近在使用AVpro插件播放http视频&#xff0c;在Editor中一切正常&#xff0c;然而打包在Android平台下就播放不了 AVPro在Unity中的警告&#xff1a; 感觉只是个警告&#xff0c;没引起注意…