mysql由于临时表导致IO过高的性能优化过程分享,三面美团、四面阿里成功斩下offer

文章分享了一次针对SQL查询优化的经历,由于临时表导致的IO过高问题,通过拆分SQL语句,显著提升了执行速度。优化前在SATA和SSD机器上分别耗时50s和7s,优化后速度提升至原来的100倍和10倍以上。同时,讨论了MySQL临时表的内存与磁盘存储、使用场景以及相关配置,提供了避免和优化临时表的方法。
摘要由CSDN通过智能技术生成

这条sql语句的问题其实还是比较明显的: 查询了大量数据(包括数据条数、以及g.* ),然后使用临时表order by,但最终又只返回了20条数据。

DBA观察到的IO高,是因为sql语句生成了一个巨大的临时表,内存放不下,于是全部拷贝到磁盘,导致IO飙升。

【优化方案】

优化的总体思路是拆分sql,将排序操作和查询所有信息的操作分开。

第一条语句:查询符合条件的数据,只需要查询g.id即可

SELECT DISTINCT g.id FROM gm_game g

LEFT JOIN gm_cp cp ON cp.id = g.cp_id AND cp.deleted = 0

LEFT JOIN gm_category c ON c.id = g.category_id AND c.deleted = 0

LEFT JOIN gm_type t ON t.id = g.type_id AND t.deleted = 0

WHERE g.deleted = 0 ORDER BY g.modify_time DESC LIMIT 20 ;

第二条语句:查询符合条件的详细数据,将第一条sql的结果使用in操作拼接到第二条的sql

SELECT DISTINCT g.*, cp.name AS cp_name,c.name AS category_name,t.name AS type_name FROM gm_game g

LEFT JOIN gm_cp cp ON cp.id = g.cp_id AND cp.deleted = 0

LEFT JOIN gm_category c ON c.id = g.category_id AND c.deleted = 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值