MySQL | 查询接口性能调优、编码方式不一致导致索引失效

背景

最近业务反馈,列表查询速度过慢,需要优化。

到正式环境系统去验证,发现没筛选任何条件的情况下,查询需要三十多秒,而筛选了条件之后需要13秒。急需优化。

先说结论:连表用的字段编码方式不一致导致索引不可用。

SQL验证

1.本地运行项目,找到相应的查询接口,利用MbBatis Log插件获取到分页查询的SQL,拿到数据库去运行,18秒,好久。

2.而且,因为项目使用的是jeecgboot项目,分页在分页查询之后会先查询总数,拿查总数的SQL来验证。也是要13秒,太慢啦。

看看执行计划

3.从SQL来看,u表有用到主键id来做关联,照理说索引应该用主键才对,但执行计划显示并没有使用主键。尝试把u表相关的关联表去掉看看是不是这个表的原因。

4.速度大幅度提高,说明问题确实出现在u表相关的几个表。去看看u表的结构。索引是存在的,但却并没有用到,很奇怪。再看看编码方式。

5.再对比一下关联的hr表的sys_user_id字段

6.两个字段的编码方式不一样,尝试把u表的编码方式改成和hr表一致。再运行SQL。

7.速度提升不明显,再看看执行计划。

8.ud表好像也有点问题,索引类型不太正常,看了一下表结构,发现也是编码问题,顺便也改了(d表也有一样问题,也改了)。

9.看看分页查询的速度

10.这个速度还可以,再看看执行计划。索引的类型现在要么是eq_ref,要么是ref,并且能用主键的基本也是用主键,符合预期了。

修改前后执行计划对比

前

后

11.最后去系统体验,查询速度大概是3.6秒,相比一开始的30多秒,速度提升了七八倍。

分析

本来u表的数据量并不大,但其他表连接之后,数据量已经非常大了,u表的速度稍微慢一点都会很明显。而u表几乎是全表扫描,也就出现了整个接口速度很慢的场景。

想要继续调优,目前的打算是把一部分主查询没有用来筛选的字段拆分开,在外层先查出来再在主SQL里面用in查询。

相关推荐
Omics Pro8 分钟前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
龙亘川13 分钟前
探索智慧文化服务:建设初衷、整体架构、技术支撑、发展现状与实践影响
大数据·数据库·架构
风早爽太17 分钟前
Python 学习笔记:数据库迁移工具 ‌Alembic
数据库·python·fastapi·alembic
java1234_小锋36 分钟前
【技术专题】Mysql8 数据库 - Mysql8 数据库基本操作
数据库·mysql
其实防守也摸鱼1 小时前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
android·数据库·学习·ai·oracle·自动化
专业程序开发源1 小时前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
jason.zeng@15022071 小时前
canal做mysql的异步传输工具
数据库·mysql·linq
Ivanqhz1 小时前
BURG(自底向上重写生成器)
服务器·数据库·人工智能·深度学习·算法
仍然.1 小时前
Redis---主从复制
java·数据库·redis
其实防守也摸鱼2 小时前
网安自测题:掌握核心知识点的实用练习
linux·运维·服务器·前端·数据库·sql·xss