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

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

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

其次将extra一栏的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是多字段,则必须依照顺序创建

详情可参考链接:https://blog.csdn.net/dingxingmei/article/details/49096591

 

 

二、第二条语句

经过许多网友的指正,我发现了之前的语句的确存在错误,故此处使用类似的语句进行说明更正

此处感谢@ykq 、@生尘一 、@walzzz 等网友给出的指正

 

-- 原sql语句
 explain
select s.* from s_menu s left join s_roles_menus p on p.menu_id = s.id  where s.type != 0 AND p.role_id = 1 order by s.id desc

 

这条语句就比较讨人厌了,同时出现了Using temporary(临时表)、Using filesort(文件排序)

执行计划结果

 

语句执行结果集

 

 

 

 

 

 之前的错误语句

-- 错误的sql语句,where代表的是返回结果的时候过滤,on代表了满足on条件的子结果集,再合并
-- 所以,如果再where中如果过滤关联表条件,那么就只能是等关联表的结果集出来之后,再进行查询,那么则必然要使用到临时表存放关联结果集,在关联结果集上进行过滤
-- 如果需要返回,关联的s_roles_menus表中的字段,那么这条sql语句,我暂时认为无法在不变更逻辑的情况下,去除对临时表的使用
 explain
select s.* from s_menu s left join s_roles_menus p on p.menu_id = s.id AND p.role_id = 1 where s.type != 0 order by s.id desc

错误的sql语句,where代表的是返回结果的时候过滤,on代表了满足on条件的子结果集,再合并

所以,如果再where中如果过滤关联表条件,那么就只能是等关联表的结果集出来之后,再进行查询,那么则必然要使用到临时表存放关联结果集,在关联结果集上进行过滤
如果需要返回,关联的s_roles_menus表中的字段,那么这条sql语句,我暂时认为无法在不变更逻辑的情况下,去除对临时表的使用

如果有大神看到此处,还请耽误您几分钟时间指点指点

  

执行结果集,将where后面的语句添加到on中,会导致逻辑变动

 

 

 

 

 修正后的语句

 按要求最后更正sql语句,采用子表过滤,在满足不使用Using temporary(临时表)、Using filesort(文件排序)的同时、也兼顾了语句的逻辑正确性

 

-- 更正后的语句:考虑了下,目的是为了获取s_roles_menus表中id为1的数据所关联的s_menu表中的数据,其中不需要返回s_roles_menus表中相关的字段,所以按照下面的语句使用子查询执行
 explain
select s.* from s_menu s where s.type != 0 and exists(select 1 from s_roles_menus p where p.menu_id = s.id AND p.role_id = 1 ) order by s.id desc

 

 

 

最终结果集

 

 

 

 至于上面所说的 != 导致不走索引,目前没有发现什么好的方法解决,百度出来有一种方法是通过union函数将大于 和小于连接起来

但是我的语句中因为还需要排序,所以会造成另一个额外表,故不采用!

如果哪位大神知道还有其他方法解决,请留言告知,感激不尽!

 

posted on 2019-10-10 15:19  浅灰色的记忆  阅读(30344)  评论(8编辑  收藏  举报