写在前面

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用法及实践的更多相关文章

  1. 【转载】 mysql explain用法

    转载链接:  mysql explain用法 官网说明:     http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 参数:  htt ...

  2. mysql explain用法

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了,如: explai ...

  3. MySQL--07 explain用法

    目录 MySQL explain用法 一.explain命令应用 二. Extra(扩展) 三.建立索引的原则(规范) 总结: MySQL explain用法 一.explain命令应用 查询数据的方 ...

  4. MySQL Explain 结果解读与实践

    Explain 结果解读与实践   基于 MySQL 5.0.67 ,存储引擎 MyISAM .   注:单独一行的"%%"及"`"表示分隔内容,就象分开&qu ...

  5. mysql 性能分析及explain用法

    转载自http://blog.sina.com.cn/s/blog_4586764e0100o9s1.html 使用explain语句去查看分析结果 如   explain select * from ...

  6. mysql的explain用法

    Mysql—explain的参数详解及用法 EXPLAIN 的每个输出行提供一个表的相关信息,并且每个行包括下面的列: 项 说明 id MySQL Query Optimizer 选定的执行计划中查询 ...

  7. MySQL Explain学习笔记

    目录 一.执行计划概念 二.Explain用法 三.Explain属性介绍 3.1 id属性 3.2 select_type属性 3.3 table属性 3.4 type属性 3.5 possible ...

  8. MySQL · 答疑解惑 · MySQL 锁问题最佳实践

    http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...

  9. mysql explain用法和结果的含义

    重点是第二种用法,需要深入的了解. 先看一个例子: mysql> explain select * from t_order; +----+-------------+---------+--- ...

随机推荐

  1. java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧

    11. 6 调试技巧 1)一个不太为人所知却非常有效的技巧是在每个类中放一个main方法,这样就可以对每个类进行单元测试.这个方法可以保留,因为在java虚拟机只调用启动类的main方法. 2)   ...

  2. 20145222黄亚奇《Java程序设计》实验五实验报告

    20145222 <Java程序设计>实验五实验报告 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20 ...

  3. 清除sql server 登录的时候记住的账户

    SQl 2008如何清除登陆过的服务器名称   C:\Users\Administrator\AppData\Roaming\Microsoft\Microsoft SQL Server\100\To ...

  4. JS的解析机制

    JS的解析机制,是JS的又一大重点知识点,在面试题中更经常出现,今天就来唠唠他们的原理.首先呢,我们在我们伟大的浏览器中,有个叫做JS解析器的东西,它专门用来读取JS,执行JS.一般情况是存在作用域就 ...

  5. unity3d 赛车游戏——复位点检测优化、反向检测、圈数检测、赛道长度计算

    接着上一篇文章说 因为代码简短且思路简单 所以我就把这几个功能汇总为一篇文章 因为我之前就是做游戏外挂的 经过验证核实,**飞车的复位点检测.圈数检测就是以下的方法实现的 至于反向检测和赛道长度计算, ...

  6. [USACO2003][poj2018]Best Cow Fences(数形结合+单调队列维护)

    http://poj.org/problem?id=2018 此乃神题……详见04年集训队论文周源的,看了这个对斜率优化dp的理解也会好些. 分析: 我们要求的是{S[j]-s[i-1]}/{j-(i ...

  7. C#配置文件管理

    最近在做项目的过程中用到配置文件,本文简要说明本人在项目过程中是如何使用配置文件的,目的是加深自己对配置文件管理的理解,以便在下次使用时能做到轻松自如. 配置文件,顾名思义,是用户在使用系统或者软件时 ...

  8. Bootstrap3.0学习第二十四轮(JavaScript插件——按钮)

    详情请查看 http://aehyok.com/Blog/Detail/30.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:h ...

  9. javascript继承(八)-封装

    这个系列主要探讨的是javascript面向对象的编程,前面已经着重介绍了一下js的继承,下面想简单的说一下js如何实现封装的特性. 我们知道面向对象的语言实现封装是把成员变量和方法用一个类包围起来, ...

  10. 国内公共DNS

    DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终 ...