Mysql-explain之Using temporary和Using filesort解决方案

项目刚刚告一段落,boos又让优化几个主要界面函数

程序代码方便的优化就不讲了,主要说MySQL的优化优化

首先查看explain执行计划,让主要查询语句使用索引,索引type级别最好达到ref | ref_eq级别spa

其次将extra一栏的Using temporary(临时表)、Using filesort(文件排序)拖出去砍了.net

第一条语句3d

explain
select * from tb_wm_shop where is_delete != 1 and is_authentication = 1 ORDER BY create_time DESCblog

 

 

 你们应该知道使用order by的 字段要使用索引,这条语句中create_time已经建立了索引,可是计划中并无使用该索引,致使出现了Using filesort文件排序,使其查询变慢排序

解决方法以下:索引

从where条件开始,依照顺序建立一个组合索引,就能够砍掉Using filesort这个使人讨厌的头颅了get

注意:必须依照顺序,在建立组合索引时,where条件的字段在orderBy的字段以前,若是orderBy是多字段,则必须依照顺序建立it

详情可参考连接:http://www.javashuo.com/article/p-evonndrz-bb.html

 

 

第二条语句

 

 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函数将大于 和小于链接起来

可是个人语句中由于还须要排序,因此会形成另外一个额外表,故不采用!

若是哪位大神知道还有其余方法解决,请留言告知,感激涕零!

相关文章
相关标签/搜索