记一次Mysql慢SQL优化过程

news2024/10/7 12:19:01

缘起

最近有个同事让我看看一个测试环境的SQL,因为这个SQL执行了几十秒,导致接口超时了。
sql为(里面表名已经使用test_table开头的表名脱敏,返回的字段使用*脱敏,别名未修改):

select
    *
from
    test_table1 e
join test_table2 ebp on
    ebp.event_id = e.id
    and ebp.is_deleted = 'N'
    and e.id in (1260,1294,1297,1300,
    1520,1727,1730,1731,1820,1897,
    1898,1899,1900,2542,2543,2920,
    3137,3140,4843,4858,4942,5014,
    5077,5324,5337,5536,5550,5556,
    5557,5558,5560,5563,5564,5567,
    5568,5797,5798,5845,6645)
    and e.is_deleted = 'N'
    and e.is_display = '1'
join (
    select
        *
    from
        test_table3 p
    left join test_table4 a on
        p.attr_id = a.id
    where
        p.is_deleted = 'N'
        and a.is_deleted = 'N' ) tcp on
    ebp.buried_point_type = tcp.buried_point_type

过程

先使用EXPLAN看下:
在这里插入图片描述
我们来回顾下这几个字段代表的意义:

type 访问类型 以下类型性能从差到优:
all:全表扫描,这个代价是最大的,性能最差的,有很大的优化空间
index:全索引扫描,扫描所有索引,比全表扫描快一点
range:: 范围查询,这个范围一定是用了索引的范围,大多出现在>,<,>=,<=,BWTWEEN这种带范围的查询
ref:结果是使用了索引的(非主键索引,非唯一索引),我们知道索引是有序的,即使是这个索引有重复字段,也会在一个小范围内并且连续,不会全表扫描
ref_eq:使用了索引结果只有一个,出现在查询用到了唯一索引或主键索引的场景
const:当前查询使用了主键索引

Extra 额外访问类型:
using where
使用where条件进行了数据过滤,一般遇到这个很难判定性能好坏,需要和type一起判断是否需要优化
using index
使用了索引,一般来讲结果都在一颗索引树上查到(无需回表),性能较好,一般不需要优化
using index condition
使用了索引,但是需要回表,此时优化一般是使用覆盖索引
using filesort
使用了临时文件进行排序,一般出现在order by的排序中由于排序字段没加索引导致全部数据排序,并且没法再内存中完成排序,性能较差,一般会在排序字段上加索引,避免全部排序
using temporary
使用了临时表,性能较差,一般出现在``group by和order by`一起的时候,分组字段和排序字段不一致导致需要中渐变暂存结果,优化方案一般是加索引
using join buffer (Block Nested Loop)
需要循环计算,一般出现在两个表join操作但是join的字段没有加索引导致,一般优化方案是在join的字段上加索引

possible keys 可能使用的索引

key 实际使用到的索引

ref 查询中使用到的与其它表的关联字段,外键等

以上引用来自我的其它博客 mysql慢日志分析,执行计划

可以看到type有两个ALL,这个大概就是最慢的两个点了,去看下为啥会全表扫描,发现这个表只有一个主键id是主键索引,但是 表连接ebp.event_id = e.id中的ebp.event_id却没有索引
在这里插入图片描述
这还怎么玩?没有索引大概就是全表扫描的原因了。再看另一个typeALL的表,是一样的,也是只有一个主键建了索引,p.attr_id = a.id中的attr_id根本没索引。把上面两个字段加上索引试下。
在这里插入图片描述
可以看到ebp这个表的type已经不是ALL了,但是p还是ALL,p是ALL的原因应该是attr_id虽然加了索引,但是走这个索引的话要全量回表去取所有字段,就不如直接全量扫描更快了,起码省略了扫描索引并回表操作了。如果取得不是全部字段,可以考虑使用覆盖索引优化

总结

讲道理的话,连结查询的字段一定是要加索引的,这个表因为历史原因没有加,最开始我感觉这玩意儿正常人都会加吧,结果就是没有,可能当时设计人员认为没有很多数据吧。历史问题就不追究了,主要是要知道怎么去定位问题和解决问题。

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

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

相关文章

分布式文件存储与数据缓存 FastDFS

一、FastDFS概述 1.1 什么是分布式文件系统 单机时代 初创时期由于时间紧迫&#xff0c;在各种资源有限的情况下&#xff0c;通常就直接在项目目录下建立静态文件夹&#xff0c;用于用户存放项目中的文件资源。如果按不同类型再细分&#xff0c;可以在项目目录下再建立不同的…

【Linux -- systemctl管理服务】

Linux – systemctl管理服务 文章目录 Linux -- systemctl管理服务一、通过systemctl管理单一服务(service unit)二、通过systemctl查看系统上所有的服务三、通过systemctl管理不同的操作环境(target unit)四、通过systemctl分析各服务之间的依赖性总结 一、通过systemctl管理单…

ssh打开远程vscode

如果想要远程打开其他终端的vscode&#xff0c;首先要知道远程终端的ip地址和用户名称以及用户密码 1、打开本地vscode 2、点击左下角蓝色区域 3、页面上部出现如下图&#xff0c;点击ssh&#xff0c;我这里已经连接&#xff0c;所以是connect to host 4、选择Add New SSH Host…

系统架构设计师-软件架构设计(1)

目录 一、软件架构的概念 1、架构的本质 2、架构的作用 二、架构发展历史 三、架构的 “4 1” 视图 1、逻辑视图&#xff08;Logical View&#xff09; 2、开发视图&#xff08;Development View&#xff09; 3、进程视图&#xff08;Process View&#xff09; 4、物理视图…

Python操作文件:从入门到“悟”

一、打开文件 Python里面打开文件可以使用内置的open函数。 open函数的定义如下&#xff1a; def open(file, moder, bufferingNone, encodingNone, errorsNone, newlineNone, closefdTrue): # known special case of open常用参数介绍&#xff1a; file&#xff1a;指定要打…

苹果账号被禁用怎么办

转载&#xff1a;苹果账号被禁用怎么办 目录 禁用的原因 解除Apple ID禁用 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKQ1ILhC-1689932607373)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw)]​编辑 …

win10电脑便签常驻桌面怎么设置?

你是否曾经因为繁忙的工作而忘记了一些重要的事项&#xff1f;相信很多人都会回答&#xff1a;忘记过&#xff01;其实在快节奏的职场中&#xff0c;我们经常需要记录一些重要的信息&#xff0c;例如会议时间、约见客户时间、今天需要完成的工作任务等。而为了能够方便地记录和…

【简单认识MySQL函数和高级语句】

文章目录 一.常用查询1.按关键字排序&#xff08;ORDER BY 语句&#xff09;1、语法格式2、 ASC和DESC的排序概念3、举例1、按分数排序&#xff0c;默认不指定是升序排列2、分数按降序排列3、order by 还可以结合where进行条件过滤&#xff0c;筛选地址是南京的学生按分数降序排…

07.计算机网络——数据链路层

文章目录 数据链路层以太网帧格式MAC地址理解MAC地址和IP地址认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响 ARP协议**ARP**协议的作用ARP协议的工作流程ARP数据报的格式 数据链路层 ​ 数据链路层在物理层提供的服务的基础上向网络层提供服务&#xff0c;…

了解持续集成、交付和部署

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 软件开发公司变得越来越敏捷。他们不断适应新技术和实践&#xff0c;以在其业务领域保持领先地位。在软件开发中&#xff0c;三种策略&#xff1b;持续集成、持续交付和持续部署是为了快速、一致地开发、部署、测试和…

Android dp to pix resources.getDimension(R.dimen.xxx) ,kotlin

Android dp to pix resources.getDimension(R.dimen.xxx) ,kotlin <?xml version"1.0" encoding"utf-8"?> <resources><dimen name"my_size_dp">20dp</dimen><dimen name"my_size_px">20px</dime…

研发机器配网方案(针对禁止外网电脑的组网方案)

背景&#xff1a;公司是研发型小公司&#xff0c;难免会使用A某D和K某l 等国内免费软件&#xff0c;这两个是业界律师函发得最多的软件。最简单的方案是离网使用&#xff0c;但是离网使用比较麻烦的是要进行文件传输&#xff0c;需要使用U盘拷贝&#xff0c;另外研发型企业一般…

【UE5】CallCustomEvent插件的使用文档

该插件是一款可以帮助你调用任意的蓝图自定义事件 使用该插件调用自定义事件时&#xff0c;你不需要实现获取对方类的引用 比如我在A类里创建了一个名叫“MyPrint”的自定义事件 因为该节点有三个参数&#xff0c;所以我们在B类中调用三个参数的CallCustomEvent节点 然后在B类…

蓝桥杯刷题记录-2020省赛

比较全面的记录2020省赛题目&#xff0c;本篇文章全文都是采用Python解题&#xff0c;题目都是基础简单的题目 1.成绩统计 解题代码&#xff1a; import os import sys nint(input()) well0 ok0 for i in range(n):aint(input())if a>85:well1ok1elif a>60:ok1 print(&…

网络安全:密码学基本理论.

网络安全&#xff1a;密码学基本理论. 密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律&#xff0c;应用于编制密码以保守通信秘密的&#xff0c;称为编码学&#xff1b;应用于破译密码以获取通信情报的&#xff0c;称为破译学&#xff0c;总称密码学. 目录…

【itext7】itext7操作PDF文档之添加表单控件(单行文本框、多行文本框、单选框、复选框、下拉框、按钮)

这篇文章&#xff0c;主要介绍itext7操作PDF文档之添加表单控件&#xff08;单行文本框、多行文本框、单选框、复选框、下拉框、按钮&#xff09;。 目录 一、itext操作PDF表单 1.1、添加单行文本框 1.2、添加多行文本框 1.3、添加单选框 1.4、添加复选框 1.5、添加下拉框…

目标检测——SSD模型介绍

目录 SSD网络结构backboneextra部分loc和clsPriorBox层先验框的生成方法loc的预测结果 模型训练正负样本标记损失函数困难样本挖掘 模型预测 SSD网络结构 backbone extra部分 loc和cls PriorBox层先验框的生成方法 loc的预测结果 模型训练 正负样本标记 损失函数 困难样本挖掘…

rabbitmq访问异常

看到这个问题&#xff0c;第一时间想到rabbitmq的问题&#xff0c;应该权限导致的 先创建virtual hosts 接着创建用户并赋予权限,将eayc的virtual hosts权限赋予acc用户即可 15:34:24.250 WARN com.rabbitmq.client.impl.ForgivingExceptionHandler - An unexpected connec…

自动驾驶技术架构

自动驾驶技术架构 自动驾驶技术架构 自动驾驶关键技术 自动驾驶汽车技术架构较为复杂&#xff0c;涉及了多领域的交叉互容&#xff0c;例如汽车、交通、通信等&#xff0c;基于自动驾驶相关的软硬件、辅助开发工具、行业标准等各方面关键问题&#xff0c;自动驾驶汽车关键技术…

RedisTemplate存数据乱码

目录 方法一&#xff1a;为RedisTemplate写一个配置类 方法二&#xff1a;用StringRedisTemplate 我猜测&#xff0c;你可能想往redis里直接存对象&#xff0c;但是存完后&#xff0c;打开redis&#xff0c;才发现自己存进去的key和value均是乱码。 原因可能是因为你用redis…