Mysql-explain之Using temporary和Using filesort解决方案
第一条语句
explain
select * from tb_wm_shop where is_delete != 1 and is_authentication = 1 ORDER BY create_time DESC
大家应该知道使用order by的 字段要使用索引,这条语句中create_time已经创建了索引,但是计划中并没有使用该索引,导致出现了Using filesort文件排序,使其查询变慢
解决方法如下:
从where条件开始,依照顺序创建一个组合索引,就可以砍掉Using filesort这个令人讨厌的头颅了
注意:必须依照顺序,在创建组合索引时,where条件的字段在orderBy的字段之前,如果orderBy是多字段,则必须依照顺序创建
第二条语句
explain
select s.* from tb_wm_popularize p left join tb_wm_shop s on p.shop_id = s.id where s.is_delete != 1 AND p.type = 1 order by s.sale_num desc
这条语句就比较讨人厌了,同时出现了Using temporary(临时表)、Using filesort(文件排序)
一个小时的百度,找到了原因
其一,参考:https://www.iteye.com/blog/hudeyong926-785181
发现了错误一:左联接表时,如果orderBy使用的字段是第二张表的字段就会照成Using temporary,修改语句以下是结果
发现结果还是没变,经过确认以上链接的真实性,引出了第二个问题:
and p.type = 1 这个导致了查询之后又将p 表 引为了第一张表,导致第一个问题解决之后任然没有生效,就有了以下改动:
现在临时表没有了,开始解决剩下的Using filesort
上面已经说了,建立一个sale_num的索引就可以了,不过我的语句里面还有一个错误,就是 != 会导致语句不走索引,因程序业务逻辑符合条件 改为is_delete = 0完成优化
至于上面所说的 != 导致不走索引,目前没有发现什么好的方法解决,百度出来有一种方法是通过union函数将大于 和小于连接起来
但是我的语句中因为还需要排序,所以会造成另一个额外表,故不采用!
本文来自博客园,作者:飞龙在生,转载请注明原文链接:https://www.cnblogs.com/flzs/p/14242331.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!