[MySql]explain用法及实践
写在前面
explain对我们优化sql语句是非常有帮助的。可以通过explain+sql语句的方式分析当前sql语句。
例子
EXPLAIN SELECT dt,method,url FROM app_log WHERE id=11789
table
显示这一行数据属于哪张表,若在查询中为select起了别名,则显示别名。
EXPLAIN SELECT dt,method,url FROM app_log AS temp WHERE id=11789
type
在表里查到结果所用的方式。包括(性能有差——>高): All | index | range | ref | eq_ref | const,system | null |
all:全表扫描,MySQL 从头到尾扫描整张表查找行。
EXPLAIN SELECT dt,method,url FROM app_log AS temp LIMIT 100
注意:这里虽然使用limit但并不能改变全表扫描。
index:按索引扫描表,虽然还是全表扫描,但优点是索引是有序的。
EXPLAIN SELECT id FROM app_log AS temp LIMIT 100
range:以范围的方式扫描索引。比较运算符,以及in的type都是range。
EXPLAIN SELECT * FROM app_log AS temp WHERE id>100 LIMIT 199
ref:非唯一性索引访问
EXPLAIN SELECT * FROM app_log AS temp WHERE dt='2015-01-02' LIMIT 199
eq_ref:使用唯一性索引查找(主键或唯一索引)
EXPLAIN SELECT * FROM app_log JOIN app_details_log USING(id)
先全表扫描了app_details_log表,然后在对app_log进行eq_ref查找。因为app_log的id字段是主键。如果此时删除app_log的id为主键,则都会进行全表扫描。
const:常量,在整个查询过程中这个表最多只会有一条匹配的行,比如主键 id=1 就肯定只有一行,只需读取一次表数据便能取得所需的结果,且表数据在分解执行计划时读取。
EXPLAIN SELECT * FROM app_log WHERE id=11790
注意:system 是 const 类型的特例,当表只有一行时就会出现 system 。
null:在优化的过程已经得到结果,不再需要访问表或索引。例如表中并不存在id=1000的记录。
EXPLAIN SELECT * FROM app_log WHERE id=1000
possible_keys
可能被用到的索引。
EXPLAIN SELECT * FROM app_log WHERE id>100 LIMIT 100 ;
Key
查询过程中实际用到的索引,例子如上图,实际用的索引列为主键列。
key_len
索引字段最大可能使用的长度。例如上图中,Key_len:4,因为主键是int类型,长度为4.
ref
指出对key列所选择的索引的查找方式,常见的有const,func,null,具体字段名。当key列为null,即不使用索引时,此值也为null.
rows
mysql估计需要扫描的行数,只是一个估算。
Extra
这个显示其他的一些信息,但对优化sql也非常的重要。
using Index:此查询使用了覆盖索引(Convering Index),即通过索引就能返回结果,无需访问表。弱没显示“Using Index”表示读取了表数据。
EXPLAIN SELECT id FROM app_log;
因为 id 为主键索引,索引中直接包含了 id 的值,所以无需访问表,直接查找索引就能返回结果。
using where:mysql从存储引擎收到行后再进行“后过滤(Post-filter)”。后过滤:先读取整行数据,再检查慈航是否符合where的条件,符合就留下,不符合便丢弃。检测是在读取行后进行的,所以叫后过滤。
EXPLAIN SELECT id FROM app_log WHERE id>100 LIMIT 100;
using temporary:使用到临时表,在使用临时表的时候,Extra为这个值。
using filesort:若查询所需的排序与使用的索引的排序一直,因为索引已排序,因此按索引的顺序读取结果返回,否则,在取到结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现using filesort。
EXPLAIN SELECT id FROM app_log WHERE id>100 GROUP BY dt;
一个优化的例子
我需要对app_log的表按时间进行分组,显示每个小时的人数。
通过上面你可以看到type一个为all,一个为range。为all的查询需要23+s,而下面的则只需要0.3s。通过rows也能看出优化后,表扫描的行数变化。
参考资料
《高性能 Mysql》(第三版)
[MySql]explain用法及实践的更多相关文章
- 【转载】 mysql explain用法
转载链接: mysql explain用法 官网说明: http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 参数: htt ...
- mysql explain用法
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了,如: explai ...
- MySQL--07 explain用法
目录 MySQL explain用法 一.explain命令应用 二. Extra(扩展) 三.建立索引的原则(规范) 总结: MySQL explain用法 一.explain命令应用 查询数据的方 ...
- MySQL Explain 结果解读与实践
Explain 结果解读与实践 基于 MySQL 5.0.67 ,存储引擎 MyISAM . 注:单独一行的"%%"及"`"表示分隔内容,就象分开&qu ...
- mysql 性能分析及explain用法
转载自http://blog.sina.com.cn/s/blog_4586764e0100o9s1.html 使用explain语句去查看分析结果 如 explain select * from ...
- mysql的explain用法
Mysql—explain的参数详解及用法 EXPLAIN 的每个输出行提供一个表的相关信息,并且每个行包括下面的列: 项 说明 id MySQL Query Optimizer 选定的执行计划中查询 ...
- MySQL Explain学习笔记
目录 一.执行计划概念 二.Explain用法 三.Explain属性介绍 3.1 id属性 3.2 select_type属性 3.3 table属性 3.4 type属性 3.5 possible ...
- MySQL · 答疑解惑 · MySQL 锁问题最佳实践
http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...
- mysql explain用法和结果的含义
重点是第二种用法,需要深入的了解. 先看一个例子: mysql> explain select * from t_order; +----+-------------+---------+--- ...
随机推荐
- LeetCode:Convert Sorted Array to Binary Search Tree,Convert Sorted List to Binary Search Tree
LeetCode:Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in asce ...
- ORCHARD中文文档(翻译)
众所周知,Orchard是.net领域最好的开源CMS之一,他使用了微软最先进的技术,有一群先进理念的支持者,但是,所有的事情在国内总得加个但是,Orchard也不例外,中文资料相对比较少,官网提供的 ...
- Windows Phone8 中如何引用 SQLite 数据库2
本博文编写环境 VS2013 + WP8 SDK 上篇介绍完了SQLite在wp中的部署(具体请参阅 Windows Phone8 中如何引用 SQLite 数据库),下面来看如何使用 SQLite ...
- 微信小程序剖析【下】:运行机制
在上一篇<微信小程序「官方示例代码」浅析[上]>中,我们只是简单的罗列了一下代码,这一篇,让我们来玩点刺激的——就是看看IDE的代码,了解它是怎么运行的. 还好微信的开发团队在软件工程的实 ...
- 第一章:Javascript语言核心
本节是javascript语言的一个快速预览,也是本书的第一部分快速预览. 读此书之前,感谢淘宝技术团队对此javascript核心的翻译,感谢弗拉纳根写出此书.感谢你们无私的分享,仅以此笔记献给你们 ...
- linux用终端上传文件和文件家到远程的服务器
文件上传:scp 本地文件地址 root@aifei8.net:/var/www/html/landrover 文件夹上传:1.先进入文件夹目录 2. 执行命令:scp -r . root@aifei ...
- iOS7(iPhone4)button不能改变button的title
最近整了个高端的iPhone4测试机,系统是iOS7.1,测出一个问题,两个button,第二个的enable为NO,点击第一个button,第二个的title改变,然而在iPhone4上并不能运行, ...
- 【BZOJ 3036】 绿豆蛙的归宿
求期望的题目(~~~water~~~) 压了下代码,压成15行hhh: 我把代码压成这么丑估计也没有人看吧: 毕竟是zky讲的一个水题,就当给博客除草了: dfs回溯时求当前节点的f,除以当前节 ...
- sql-数据库的隔离级别
read uncommited (读未提交) 最低级别,可读取未提交事物的数据,这会导致脏读,比如:某时刻会话a修改了一个数据,但还未提交,此时会话b,读取了该数据,这是,会话a回滚了事物 ...
- Tomcat tomcat-users.xml详解
conf/tomcat-users.xml <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rol ...