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函数将大于 和小于连接起来
但是我的语句中因为还需要排序,所以会造成另一个额外表,故不采用!
Mysql-explain之Using temporary和Using filesort解决方案的更多相关文章
- Mysql EXPLAIN 相关疑问: Using temporary ; Using filesort
一.什么是Using temporary ; Using filesort 1. using filesort filesort主要用于查询数据结果集的排序操作,首先MySQL会使用sort_buff ...
- mysql explain using filesort
创建表,字段tid上无索引(mysql 5.7) CREATE TABLE `test` ( `tid` int(11) DEFAULT NULL, `tname` varchar(12) DEFAU ...
- 【转载】 mysql explain用法
转载链接: mysql explain用法 官网说明: http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 参数: htt ...
- mysql explain的使用(优化查询)
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 1.创建数据库 创建的sql语句如下: /* Navicat MySQL D ...
- mysql explain用法
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了,如: explai ...
- Mysql Explain 详解(转)
原文:http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html 一.语法 explain < table_name > ...
- mysql explain详解
对于经常使用mysql的兄弟们,对explain一定不会陌生.当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联合和以什么次序的信息.借助于 ...
- mysql explain用法和结果的含义
重点是第二种用法,需要深入的了解. 先看一个例子: mysql> explain select * from t_order; +----+-------------+---------+--- ...
- [转]MySQL Explain详解
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...
- mysql explain 命令讲解
explian命令可以显示select语句的执行计划 explain的结果中每行对应select语句中的一个表,输出结果中的顺序是按照语句处理表的顺序. mysql使用嵌套循环来处理所有的join连接 ...
随机推荐
- WPF自定义控件,如何使得xaml涉及器中的修改能立即反应到预览
这是我无意中发现的,xaml中设置的是依赖属性而不是包装器,所以我们可以直接在注册依赖属性那里设置回调,触发某个控件重绘,比如本身或父控件重绘. xaml设计器就会实时更新 1 // !!!由于xam ...
- apisix~集成服务发现注册中心
摘要 当业务量发生变化时,需要对上游服务进行扩缩容,或者因服务器硬件故障需要更换服务器.如果网关是通过配置来维护上游服务信息,在微服务架构模式下,其带来的维护成本可想而知.再者因不能及时更新这些信息, ...
- 一款开源的.NET程序集反编译、编辑和调试神器
前言 说到.NET相关的反编译工具大家脑海里第一个想到的工具是什么?ILSpy.dnSpy.还是dotPeek?咱们今天的主要内容是讲讲dnSpyEx(dnSpyEx是dnSpy项目的非官方Fork维 ...
- ESP8266资源整理
概述 整理下学习ESP8266期间有价值的资料 乐鑫官网文档中心 主要参考资料来源,一手资料最有价值,另外官网还有选型工具.产品对比等实用工具 https://www.espressif.com.cn ...
- 【u8 login debug】u8 16.0 没有调试 login的解决办法
16.0 没有调试 login,改一下注册表 就行[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Ufsoft\WF\V8.700]"Enable.Debu ...
- 【JS】await异常捕获,这样做才完美
缘由 JS中async/await异步调用,只能通过try-catch吗? 你想听的故事: 作为一个合格的全栈搬砖工,那必须文武双全,前后必备.遂吾日三省吾身,偶发觉前端长时间不写有些落下,便抽用了摸 ...
- Android 12(S) MultiMedia Learning(一)开篇
这个系列将会作为自己学习android多媒体的笔记,如果有错误请帮忙指正. 本系列的学习均基于Android 12(S),代码来源:http://aospxref.com/
- Flutter(七):Flutter混合开发--接入现有原生工程(iOS+Android)
在上一篇文章Flutter(六):Flutter_Boost接入现有原生工程(iOS+Android)中介绍了Flutter_Boost的接入方法,这一篇将介绍Flutter自带的接入方法. 新建工程 ...
- dubbo~javax.validation和jakarta.validation的介绍与排雷
javax.validation和jakarta.validation都是用于Java中进行数据验证(validation)的相关API,它们提供了一套标准的验证框架,用于验证Java对象的属性是否符 ...
- 创建 Vue3 项目
前提条件 安装 Nodejs 下载:https://nodejs.org/en/download/prebuilt-installer 切换 npm 源 npm config set registry ...