慢SQL
今天收到开发人员反馈,一个SQL输出结果只有79行,没有任何聚合函数。 但有6个表的join 速度很慢需要11S
只为了说明问题与脱敏,原语句有改动。
SELECT *
FROM T1 a
JOIN T2 p ON a.ID1 = p.ID1 AND a.ID3 = p.ID3
WHERE a.XXX1 = 1
AND a.XX2 = 2
AND a.XX3 = 3
复制
T1表数据有300W ,T2表有400W
但T1符合条件的最后只有79行
查看执行计划
通过执行计划可以看到 T2表扫描行数达到了 138W ,明明是3键的组合索引 只用到了第一个键
组合索引是(id1,id2,id3) 看上面关联 on a.id1 = p.id1 and a.id3 = p.id3 开发没有写第二个键id2的关联条件。根据最左原则。id3是不能走上索引的。 通过Key_len=4 也可以确认,只用到了p.id1这个字段
我以为是业务需要。不能写a.id2=p.id2 准备新建一个索引。跑去咨询开发, 开发回复此语句关联写成 on a.id1=p.id1 and a.id2=p.id2 and a.id3=p.id3 语义是不变的
改写SQL 再看执行计划
SELECT *
FROM T1 a
JOIN T2 p ON a.ID1 = p.ID1 AND a.ID2 = p.ID2 AND a.ID3 = p.ID3
WHERE a.XXX1 = 1
AND a.XX2 = 2
AND a.XX3 = 3
复制
T2表扫描行数变成了1行。 key_len 变成了20
执行时间从11s变成了0.047S 性能提升了234倍
总结
当我们使用组合索引时,不管是在join处,还是在where处 都需要关注key_len 是不是整个组合索引都使用上了。还是只使用了前几个Key.
最后修改时间:2023-03-03 10:38:15
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
文章被以下合辑收录
评论
请问下 A.ID3可以作为索引下推条件吗?
5月前

评论
有人说,“靠谱,说起来简单,落下去复杂。”什么样的人最靠谱?答案是:做人讲诚信、做事不敷衍。
2年前

评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1216次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
450次阅读
2025-03-17 16:04:03
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
437次阅读
2025-03-04 21:56:13
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
436次阅读
2025-03-13 14:38:19
SQL优化 - explain查看SQL执行计划(一)
金同学
375次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
321次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
307次阅读
2025-03-17 10:36:40
[MYSQL] xtrabackup备份报错Unable to obtain lock分析
大大刺猬
231次阅读
2025-02-28 16:43:00
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
223次阅读
2025-03-10 07:58:44
MySQL8.0直方图功能简介
Rock Yan
210次阅读
2025-03-21 15:30:53