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条件后的字段顺序,使其尽可能地走索引,提升效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机SCI期刊,中科院3区,对国人相当友好

一、期刊名称 Image and Vision Computing 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;4.7 中科院分区&#xff1a;3区 三、期刊征稿范围 图像和视觉计算的主要目标是为图像解释和计算机视觉各个方面的高质量理论和应…

跟着大佬学RE(四)

几个API函数 [ACTF新生赛2020]Universe_final_answer 一个很多方程组的函数&#xff0c;还有一个嗯&#xff0c;对input进行一些操作的函数 嗯&#xff0c;确实方程解出来得到 key 直接运行就可以得到 flag 了&#xff0c;不过还是去分析了一下。 v22 __readfsqword(0x28u);…

2024.6.5

1、react原理学习&#xff0c; hook、fiber 2、瀑布流组件完善 3、代码随想录二刷

6.4分享会

介绍 严格意义上讲&#xff0c;我们在 JavaScript 阶段学习的知识绝大部分属于 ECMAScript 的知识体系&#xff0c;ECMAScript 简称 ES 它提供了一套语言标准规范&#xff0c;如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的。浏览器将 ECMAScript 大…

opencv快速安装以及各种查看版本命令

安装opencv并查看其版本&#xff0c;直接通过一个可执行文件实现。 #!/bin/bashwget https://codeload.github.com/opencv/opencv/zip/3.4 -O opencv-3.4.zip && unzip opencv-3.4.zip && cd opencv-3.4 && \mkdir build && cd build &&a…

亮数据——全球网络数据一站式平台

在我们日常的项目开发和研究中&#xff0c;数据获取总是一个让人既爱又恨的话题。找到一个既高效又安全的工具&#xff0c;简直就像是在茫茫沙漠中找到绿洲。近期&#xff0c;我测评了&#xff0c;数十家数据获取工具&#xff0c;最后锁定了&#xff0c;亮数据&#xff0c;本篇…

攻防世界—webbaby详解

1.ssrf注入漏洞 ssrf&#xff08;服务端请求伪造&#xff09;是一种安全漏洞&#xff0c;攻击者通过该漏洞向受害服务器发出伪造的请求&#xff0c;从而访问并获取服务器上的资源&#xff0c;常见的ssrf攻击场景包括访问内部网络的服务&#xff0c;执行本地文件系统命令&#…

如何在 Java 中使用 JOptionPane 显示消息对话框

在 Java 开发中&#xff0c;JOptionPane 是一个非常实用的类&#xff0c;可以用来显示各种类型的对话框&#xff0c;例如信息对话框、警告对话框、错误对话框等。今天&#xff0c;我们将深入探讨如何使用 JOptionPane.showMessageDialog 方法来显示消息对话框&#xff0c;以及如…

【Unity | Editor强化工具】资产快速访问工具

经常在Project窗口中翻找资产相对麻烦&#xff0c;Unity自带的Favorite功能又和Project窗口强绑定&#xff0c;且只能在双列视图下使用&#xff0c;故制作了一个可以在独立窗口中列举常用资产的小工具&#xff1a; Unity Asset Quick Access 。 CSDN弄了个Github加速计划&…

天润融通,荣获2024中国AI应用层创新企业

AI技术发展日新月异&#xff0c;可谓“AI一天&#xff0c;人间一年”。 从2023年到2024年&#xff0c;短短一年的时间&#xff0c;大模型技术的发展就已经逐步从追求“技术突破”转向了追求“应用落地”。如何将大模型的技术与企业的生产、运营、销售等场景结合起来&#xff0…

C语言的printf输出问题

看到这段代码的时候&#xff0c;想到这个printf输出的值是多少? 若您想到的答案是1-2&#xff0c;真的是这样吗&#xff1f; #include <stdio.h>int main(int argc, char *argv[]) {int i 1;printf("%d-%d\r\n", i, i);return 0; }先了解一个知识点&#xf…

计算机三级等级考试

计算机等级考试&#xff1a; 一&#xff1a;理论知识考试 100分考60分 1&#xff1a;题库 二&#xff1a;技能考试 100分考60分 1&#xff1a;写文档 项目概述 功能描述 数据库设计 UML 绘 图 用例图 与 包图&#xff08;两个图&#xff09; 2&…

web学习笔记(六十二)

目录 1.键盘事件 2.KeepAlive 3.组件传值 3.1 兄弟组件传值 3.2 组件树传值 3.3 发布订阅者传值 1.键盘事件 keydown表示键盘事件&#xff0c;在不加修饰符的情况下&#xff0c;点击键盘上的任意位置都可以触发键盘事件&#xff0c; <template><div><!--…

【Kubernetes】9-Pod控制器

一、什么是 pod 的控制器 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层 确保pod资源符合预期状态&#xff1b;pod的资源故障时会进行重启&#xff1b; 当重启策略无效时&#xff0c;则会重新新建pod的资源 二…

基于51单片机的智能晾衣架设计资料

第三章:硬件单元电路 经过上述分析明确了本次设计的主要目标,为了实现晾衣自身能够完成对外界数据的采集与分析,集成控制环节我们采用了ATMEL公司生产的AT89C52单片机,与市面上的其他嵌入式控制单元相比较在体积与功耗方面都相当出色。此次设计主要突破在于设计合理的控制电…

注册用户超6亿,哈啰发布年度可持续发展暨ESG报告

6月5日&#xff0c;哈啰发布《2023年度可持续发展暨ESG报告》&#xff0c;深入全面地展示2023年哈啰在可持续发展领域的举措和阶段性成果。 报告显示&#xff0c;哈啰始终遵循健康可持续的商业模式&#xff0c;以科技创新推动出行进化&#xff0c;在促进行业发展、环境友好、社…

特征工程及python实现

一、特征构建 概述 从原始数据中构建新的特征&#xff0c;一般需要根据业务分析&#xff0c;生成能更好体现业务特性的新特征&#xff0c;这些新特征要与目标关系紧密&#xff0c;能提升模型表现或更好地解释模型。 方法 时间周期&#xff1a;不同的时间切片长度&#xff0…

6_5 test

Lucene 存储引擎 https://www.cnblogs.com/tech-lee/p/15225276.html\ 规范 问问题的技巧 提问者&#xff1a;要实现怎样的目标&#xff1f;自己计划是如何实现这个目标的&#xff1f;问题出现在哪个环节&#xff1f;自己为了解决这个问题&#xff0c;已经做了哪些尝试和工…

GD32F470+lwip 丢包问题分析及解决

最近在用GD32和管理机之间用TCP协议开发一个功能&#xff0c;功能都没问题&#xff0c;后面跑大量发包时候的连续测试时&#xff0c;总是会出现偶发性的&#xff0c;大概几分钟到数十分钟的一次丢包。尽管在应用层做了超时机制&#xff0c;一旦超时就会重新建立socket链接并重新…

2025 QS 世界大学排名公布,北大清华跻身全球前20

一年一度&#xff0c;2025 QS 世界大学排名公布&#xff01; QS&#xff08;Quacquarelli Symonds&#xff09;是唯一一个同时将就业能力与可持续发展纳入评价体系的排名。 继去年 2024 QS 排名因为“墨尔本超耶鲁&#xff0c;新南悉尼高清华”而荣登微博热搜之后&#xff0c…