EXPLAIN:

  • extended关键字:在explain后使用extended关键字,可以显示filtered列和warning信息。在较旧的MySQL版本中,扩展信息是使用EXPLAIN EXTENDED生成的。 该语法仍然被识别为向后兼容,但扩展输出现在默认启用,因此EXTENDED关键字是多余的,已被弃用。 它的使用会导致警告,并且将在未来的MySQL版本中从EXPLAIN语法中删除。
  • partitions关键字:显示查询将访问的分区,如果你的查询是基于分区表。

在5.6版本,如果要获取filtered列和warning信息,还要加上extended关键字的。

如:

  1. mysql> EXPLAIN EXTENDED
  2.        SELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1\G
  3. *************************** 1. row ***************************
  4.            id: 1
  5.   select_type: PRIMARY
  6.         table: t1
  7.          type: index
  8. possible_keys: NULL
  9.           key: PRIMARY
  10.       key_len: 4
  11.           ref: NULL
  12.          rows: 4
  13.      filtered: 100.00
  14.         Extra: Using index
  15. *************************** 2. row ***************************
  16.            id: 2
  17.   select_type: SUBQUERY
  18.         table: t2
  19.          type: index
  20. possible_keys: a
  21.           key: a
  22.       key_len: 5
  23.           ref: NULL
  24.          rows: 3
  25.      filtered: 100.00
  26.         Extra: Using index
  27. 2 rows in set, 1 warning (0.00 sec)
  28.  
  29. mysql> SHOW WARNINGS\G
  30. *************************** 1. row ***************************
  31.   Level: Note
  32.    Code: 1003
  33. Message: /* select#1 */ select `test`.`t1`.`a` AS `a`,
  34.          <in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in
  35.          ( <materialize> (/* select#2 */ select `test`.`t2`.`a`
  36.          from `test`.`t2` where 1 having 1 ),
  37.          <primary_index_lookup>(`test`.`t1`.`a` in
  38.          <temporary table> on <auto_key>
  39.          where ((`test`.`t1`.`a` = `materialized-subquery`.`a`))))) AS `t1.a
  40.          IN (SELECT t2.a FROM t2)` from `test`.`t1`
  41. 1 row in set (0.00 sec)

SHOW WARNINGS中给出的是模拟执行计划的sql。里面有非常丰富的内容。可以提供给我们来参考。

show warnings的说明:https://dev.mysql.com/doc/refman/5.7/en/explain-extended.html

explain语法"尽量"不执行查询,但是如果为了获取执行计划需要查询(如要有子查询的结果才知道下一步的查询计划),那么explain其实是需要执行一些查询的。

EXPLAIN只是一个近似结果。以下有一些相关的限制:

  • EXPLAIN不会告诉你触发器、存储过程或UDF会如何影响查询。
  • EXPLAIN 不支持存储过程,尽管可以手动抽取查询并单独对其进行EXPLAIN操作。
  • EXPLAIN不会告诉你MySQL在查询执行中所做的特定优化。
  • EXPLAIN不会显示关于查询的执行计划的所有信息。
  • EXPLAIN不区分具有相同名字的事物。例如,它对内存排序和临时文件都使用"filesort",并且对于磁盘上和内存中的临时表都显示"Using temporary"。

重写非select查询

explain只能解释select查询,无法解释存储过程、insert、delete、update等其他类似的语句,可以把非select语句转化为对等的 select 访问请求。

ps:5.6之后可以解释update insert。

EXPLAIN中的列:

id

id用来表示执行顺序,id相同的为一组,先执行id数字大的组,然后执行数字小的组。在id相同的一组内,顺序由上而下执行。子查询和union操作产生新的id,普通的join不会产生新id。

select type

val

explain

SIMPLE

简单 SELECT(不使用 UNION 或子查询)

PRIMARY

查询中包含任何复杂查询,最外层的的SELECT

SUBQUERY

在 select 或 where 中包含的子查询

DERIVED

FROM 子句的子查询;

Mysql会将这种子查询执行并放在一个临时表中。

若 union 包含在 from 子句的子查询中,外层的 select被标记为 DERIVED。

UNION

在 select 或 where 中包含的子查询

UNION RESULT

UNION结果

DEPENDENT UNION

UNION 中的第二个或后面的 SELECT 语句,取决于外面的查询 DEPENDENT SUBQUERY

DEPENDENT SUBQUERY

子查询中的第一个 SELECT,取决于外面的查询

ps:mysql5.6有MATERIALIZED,代表物化子查询

type

表示MySQL在表中找到所需行的方式,又称"访问类型",常见类型如下:

由左至右,由最差到最好。

ALL代表全表扫描(如果有limit,也会显示ALL,其实可能没有扫描全部的数据,扫描部分就停止了),

index代表索引全扫描(一般出现在where中没有索引的条件,但是order by中有索引。),他的性能甚至不如ALL,因为ALL直接通过聚簇索引来获取数据,如果id是连续的,那么数据也是连续的,而index需要通过二级索引来检索id,然后在根据id检索数据,会产生大量io,使用这个一般是为了避免排序。

range索引范围扫描(where中有索引的条件 如> between,或者in后面是固定的值,但是in和其他的有差别,in可以想象成是拆分成很多=),

ref是非唯一性索引扫描,常见的是作用在=的比较上,但是非唯一。

eq_ref:ref的唯一性索引扫描。

const, system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。system是const类型的特例,当查询的表只有一行的情况下, 使用system。

5.6中还包含:

ref_or_null:此连接类型与ref一样,但除此之外,MySQL还会对包含NULL值的行进行额外的搜索。

如下SQ可以使用ref_or_null:

SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;

index_merge:此连接类型表示使用索引合并优化。

unique_subquery:unique_subquery只是一个索引查找功能,可以完全替换子查询以提高效率。如:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

index_subquery:此连接类型与unique_subquery类似。 它替换IN子查询,但它适用于以下形式的子查询中的非唯一索引。

possible_keys

指出MySQL能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。注:如果使用覆盖索引扫描,此处为空。

key

显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL

key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度

rows:

表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。如果三张表的join,那么将三行的rows相乘,就是数据库大概要读取的所有行数。

ref:

记录使用key列标识的索引时,查找值使用的常数或者列。

extra列:

use index:这里并不是表示使用了索引的意思。使用了索引可以通过key列来查看,而且key列显示了使用索引的名称。use index表示使用覆盖索引扫描。就是说,没有访问数据文件,所有的数据都是从索引文件中获取。

use where:这里并不是表示使用了where条件的意思,而是说服务层从存储引擎获取数据之后再进行where过滤。

Using index condition:表示使用索引条件下推。

Using filesort:使用了排序(即使是内存中的排序也叫filesort)

Using temporary:使用了临时表

Impossible WHERE:出现在优化阶段,优化器根据表定义可以判断出where条件根本不可能成立,比如主健不可能为空

Using join buffer (Block Nested Loop):mysql使用了优化过的nest loop算法,一次读取多个块.

filtered 列

这一列在使用EXPLAIN EXTENDED时出现。它显示的是针对表里符合某个条件(where子句或联接条件)的记录数的百分比所做的一个悲观估算。如果将rows列和这个百分比相乘,就能看到MySQL估算它将和查询计划里前一个表关联的行数。

ps:如果filtered比例太大,那么mysql将会舍弃使用索引,而选择ALL。

扩展:

http://www.jianshu.com/p/fa37e037aa5f 有列子

http://www.cnblogs.com/jxlwqq/p/5391232.html

高性能mysql 附录D explain执行计划详解的更多相关文章

  1. ( 转 ) MySQL高级 之 explain执行计划详解

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...

  2. MySQL高级 之 explain执行计划详解

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...

  3. MySQL高级 之 explain执行计划详解(转)

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...

  4. Mysql探索之Explain执行计划详解

    前言 如何写出效率高的SQL语句,提到这必然离不开Explain执行计划的分析,至于什么是执行计划,如何写出高效率的SQL,本篇文章将会一一介绍. 执行计划 执行计划是数据库根据 SQL 语句和相关表 ...

  5. MySQL — 优化之explain执行计划详解(转)

    EXPLAIN简介 EXPLAIN 命令是查看查询优化器如何决定执行查询的主要方法,使用EXPLAIN,只需要在查询中的SELECT关键字之前增加EXPLAIN这个词即可,MYSQL会在查询上设置一个 ...

  6. MySQL性能分析, mysql explain执行计划详解

    MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...

  7. MySql——Explain执行计划详解

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...

  8. 【夯实Mysql基础】mysql explain执行计划详解

    原文地址   1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.   2).select_type列常见的有: A ...

  9. mysql explain执行计划详解

      1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.   2).select_type列常见的有: A:simp ...

随机推荐

  1. 联想H430怎么清除cmos密码?

    联想H430怎么清除cmos密码? 方法一:长时间对cmos放电 首先断掉主机电源,然后找到主板上的纽扣电池,将电池小心取出,然后使用一金属导体,短接电池座中的正负极,这样也可达到快速放电的目的. 有 ...

  2. 【神经网络与深度学习】【C/C++】C++日志操作开源函数库之Google-glog

    今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge ...

  3. Macaca环境搭建(三)----uirecorder Android录制

    一.安装Macaca-Android 命令窗口输入:npm i macaca-android -g 二.安装android-SDK 1.下载并安装ADT-bundle,官网下载地址我就不提供了,因为下 ...

  4. asp.net之后台使用根目录运算符

    在asp.net前台,大家会经常使用根目录运算符~.这样,可以不用考虑网站的配置目录. 有时,需要在后台设置路径,同样需要使用根目录运算符.好吧,其实我每次需要使用这种方法,就需要在baidu上查找如 ...

  5. 2016年蓝桥杯省赛C++A组 消除尾一

    消除尾一: 下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0如果最后一位是0,则原数字保持不变. 如果采用代码中的测试数据,应该输出: 00000000000000000000000001 ...

  6. 设计模式:模板方法(Template method)

    首先我们先来看两个例子:冲咖啡和泡茶.冲咖啡和泡茶的基本流程如下: 所以用代码来创建如下: 咖啡:Caffee.java public class Coffee { void prepareRecip ...

  7. MyISAM与InnoDB的索引差异

    数据库的索引分为主键索引(Primary Index)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+树来实现这两类索引的,又有什么差异呢?一.MyISAM的索引 ...

  8. Postman之获得登录的token,并设置为全局变量

    1.调通登录接口(可以参考上篇博客) 网址:Postman之简单使用 2.粘贴以下代码到Tests中 //把json字符串转化为对象 var data=JSON.parse(responseBody) ...

  9. 勒索病毒[recoverydata54@cock.li].harma,这样恢复文件。

    还没有从搬新家的喜悦中恢复回来,突然有一天发现,自己的1T的硬盘的历史遗迹里面的文件都不能打开了.尤其是孩子们的珍贵照片. 这可让我着急了好几天.过了几天我才知道,原来是有天晚上,4周岁的儿子自己不知 ...

  10. PHP扩展开发01:第一个扩展

    我们先假设业务场景,是需要有这么一个扩展,提供一个叫ccvita_string的函数,他的主要作用是返回一段字符.(这个业务场景实在太假,大家就这么看看吧)对应的PHP代码可能是这样: functio ...