记一次Mysql慢SQL优化过程

news/2024/11/30 6:32:37/

缘起

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

select*
fromtest_table1 e
join test_table2 ebp onebp.event_id = e.idand 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*fromtest_table3 pleft join test_table4 a onp.attr_id = a.idwherep.is_deleted = 'N'and a.is_deleted = 'N' ) tcp onebp.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.ppmy.cn/news/979066.html

相关文章

AI加速游戏开发 亚马逊云科技适配3大场景,打造下一代游戏体验

随着疫情的消散&#xff0c;中国游戏产业正在快速前进。在伴随着游戏产业升级的同时&#xff0c;整个行业都在面临着新的挑战与新的诉求。亚马逊云科技游戏研发解决方案和服务&#xff0c;覆盖端到端3大场景&#xff0c;为游戏公司与游戏开发人员赋能。 场景1&#xff1a;AI辅助…

Clion开发stm32之微妙延迟(采用nop指令实现)

前言 需要借助逻辑分析仪动态调整参数此次测试的开发芯片为stm32f103vet6 延迟函数 声明 #define NOP_US_DELAY_MUL_CNT 5 /*nop 微妙延迟需要扩大的倍数(根据实际动态修改)*/ void bsp_us_delay_nop(uint32_t us);void bsp_ms_delay_nop(uint32_t ms);定义 void bsp_us_dela…

Windows系统创建新用户

1、以管理员身份启动cmd 2、开启administrator管理员账户 输入命令&#xff1a; net user Administrator /active:yes 3、切换到administrator用户 点击账户头像可以看见 4、创建新用户 WinR 键打开dos窗口输入&#xff1a;control userpasswords2 在弹出的“用户账户”中点…

【配置环境】Windows下 VS Code 远程连接虚拟机Ubuntu

一&#xff0c;环境 Windows 11 家庭中文版VMware Workstation 16 Pro &#xff08;版本&#xff1a;16.1.2 build-17966106&#xff09;ubuntu-22.04.2-desktop-amd64 二&#xff0c;关键步骤 Windows下安装OpenSSHVS Code安装Remote - SSH插件 三&#xff0c;详细步骤 在Ubun…

机器学习动量优化算法笔记

动量优化算法&#xff08;Momentum Optimization&#xff09;是一种常用于训练神经网络的优化算法。它通过模拟物体在惯性作用下的运动来加速梯度下降过程&#xff0c;从而加快神经网络的收敛速度并提高训练效率。 在梯度下降算法中&#xff0c;每次更新权重时都是根据当前批次…

Mysql 主从复制、读写分离

目录 一、前言&#xff1a; 二、主从复制原理 2.1 MySQL的复制类型 2.2 MySQL主从复制的工作过程; 2.2.1 MySQL主从复制延迟 2.3 MySQL 有几种同步方式&#xff1a; 三种 2.3.1、异步复制&#xff08;Async Replication&#xff09; 2.3.2、同步复制&#xff08;Sync Re…

【云原生】Docker镜像的创建,Dockerfile

一、Docker镜像的创建 创建镜像有三种方法&#xff0c;分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 1.基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web centos:7 /bin/…

ConcurrentHashMap 相比于 HashMap 的优势

ConcurrentHashMap 使用每个链表头节点作为锁对象, 把一把大锁转换成多把小锁, 大大缩小了锁冲突的概率 HashTable 是给整个 Hash 表加锁, 因此只要有线程抢到了锁其他线程就得阻塞等待. ConcurrentHashMap 是对每个链表加锁, 因此只要不是对同一个链表进行修改就不会阻塞, 大…