MySQL查询分析器EXPLAIN或DESC用法

一、简单例子:

MySQL可以通过EXPLAIN或DESC来查看并分析SQL语句的执行情况
mysql> desc one_and_two_kn_accumulate_stars;
或者
mysql> explain one_and_two_kn_accumulate_stars;
+---------------------------+--------------+------+-----+-------------------+-----------------------------+
| Field                     | Type         | Null | Key | Default           | Extra                       |
+---------------------------+--------------+------+-----+-------------------+-----------------------------+
| kn_id                     | int(11)      | NO   | PRI | 0                 |                             |
| current_state_date        | date         | NO   | PRI | NULL              |                             |
| grade_group_id            | int(2)       | NO   | MUL | NULL              |                             |
| subject_id                | int(2)       | NO   | MUL | NULL              |                             |
| kn_name                   | varchar(255) | NO   |     |                   |                             |
| parent_kn_id              | int(11)      | NO   | MUL | 0                 |                             |
| knowledge_level           | tinyint(1)   | NO   |     | NULL              |                             |
| knowledge_accumulate_star | smallint(5)  | NO   |     | NULL              |                             |
| ctime                     | timestamp    | YES  |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| knowledge_id              | varchar(32)  | NO   | MUL |                   |                             |
| parent_knowledge_id       | varchar(32)  | NO   | MUL |                   |                             |
| sort_index                | int(2)       | NO   |     | NULL              |                             |
+---------------------------+--------------+------+-----+-------------------+-----------------------------+
12 rows in set (0.00 sec)
mysql> desc one_and_two_kn_accumulate_stars \G;
由这个例子可以看出:
Field:字段表示的是列名
Type:字段表示的是列的数据类型
Null :字段表示这个列是否能取空值
Key :在mysql中key 和index 是一样的意思,这个Key列可能会看到有如下的值:PRI(主键)、MUL(普通
的b-tree索引)、UNI(唯一索引)
Default: 列的默认值
Extra :其它信息

二、具体使用格式

explain或desc显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
explain 数据表 或 desc 数据表
显示数据表各字段含义
explain sql 或desc sql
显示sql执行效率
使用方法,在select语句前加上explain就可以了,如:
mysql> desc select * from  one_and_two_kn_accumulate_stars where kn_id=1 \G;
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: one_and_two_kn_accumulate_starspartitions: NULLtype: ref
possible_keys: PRIMARY,kn_id_idxkey: PRIMARYkey_len: 4ref: constrows: 1filtered: 100.00Extra: NULL
1 row in set, 1 warning (0.00 sec)

2.1、explain列的解释

table:查询的数据表

type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和all。

possible_keys显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从where语句中选择一个合适的语句

key: 实际使用的索引。如果为null,则没有使用索引。很少的情况下,mysql会选择优化不足的索引。这种情况下,可以在select语句中使用use index(indexname)来强制使用一个索引或者用ignore index(indexname)来强制mysql忽略索引

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:mysql认为必须检查的用来返回请求数据的行数,mysql完成此请求扫描的行数

extra:关于mysql如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是using temporary和using filesort,意思mysql根本不能使用索引,结果是检索会很慢。

2.2、type中各个值解释

1)all:全表扫描,MySQL将遍历全表以找到匹配的行

2)index:index与ALL区别为index类型只遍历索引树

3)range:索引范围扫描,对索引扫描开始于某一点,返回匹配值域的行。显而易见索引范围扫描是带有between或者where子句里带有<, >查询。当mysql使用索引去查找一系列值时,例如IN()和OR列表,也会显示range(范围扫描),当然性能上是有差异的。

4)ref,使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行。

explain select * from t1 where name='yayun';

5)eq_ref,类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件。

explain select t1.name from t1, t2 where t1.id=t2.id;

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

三、mysql explain执行计划详解

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

A:simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个

B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个

C:union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union

D:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响

E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null

F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery

G:dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响

H:derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select

3)、table
显示的查询表名,如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这显示为null,如果显示为尖括号括起来的<derived N>就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生。如果是尖括号括起来的<union M,N>,与<derived N>类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集。
4)、type
依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引

A:system:表中只有一行数据或者是空表,且只能用于myisam和memory表。如果是Innodb引擎表,type列在这个情况通常都是all或者index

B:const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描

C:eq_ref:出现在要连接过个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref

D:ref:不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找。或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。

E:fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引

F:ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多。

G:unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值

H:index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。

I:range:索引范围扫描,常见于使用>,<,is null,between ,in ,like等运算符的查询中。

J:index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range

K:index:索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。

L:all:这个就是全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。

5)、possible_keys
查询可能使用到的索引都会在这里列出来
6)、key
查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个。
7)、key_len
用于处理查询的索引长度,如果是单列索引,那就整个索引长度算进去,如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去。留意下这个列的值,算一下你的多列索引总长度就知道有没有使用到所有的列了。要注意,mysql的ICP特性使用到的索引不会计入其中。另外,key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。
8)、ref
如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func
9)、rows
这里是执行计划中估算的扫描行数,不是精确值
10)、extra
这个列可以显示的信息非常多,有几十种,常用的有

A:distinct:在select部分使用了distinc关键字

B:no tables used:不带from字句的查询或者From dual查询

C:使用not in()形式子查询或not exists运算符的连接查询,这种叫做反连接。即,一般连接查询是先查询内表,再查询外表,反连接就是先查询外表,再查询内表。

D:using filesort:排序时无法使用到索引时,就会出现这个。常见于order by和group by语句中

E:using index:查询时不需要回表查询,直接通过索引就可以获取查询的数据。

F:using join buffer(block nested loop),using join buffer(batched key accss):5.6.x之后的版本优化关联查询的BNL,BKA特性。主要是减少内表的循环数量以及比较顺序地扫描查询。

G:using sort_union,using_union,using intersect,using sort_intersection:

using intersect:表示使用and的各个索引的条件时,该信息表示是从处理结果获取交集

using union:表示使用or连接各个使用索引的条件时,该信息表示从处理结果获取并集

using sort_union和using sort_intersection:与前面两个对应的类似,只是他们是出现在用and和or查询信息量大时,先查询主键,然后进行排序合并后,才能读取记录并返回。

H:using temporary:表示使用了临时表存储中间结果。临时表可以是内存临时表和磁盘临时表,执行计划中看不出来,需要查看status变量,used_tmp_table,used_tmp_disk_table才能看出来。

I:using where:表示存储引擎返回的记录并不是所有的都满足查询条件,需要在server层进行过滤。查询条件中分为限制条件和检查条件,5.6之前,存储引擎只能根据限制条件扫描数据并返回,然后server层根据检查条件进行过滤再返回真正符合查询的数据。5.6.x之后支持ICP特性,可以把检查条件也下推到存储引擎层,不符合检查条件和限制条件的数据,直接不读取,这样就大大减少了存储引擎扫描的记录数量。extra列显示using index condition

J:firstmatch(tb_name):5.6.x开始引入的优化子查询的新特性之一,常见于where字句含有in()类型的子查询。如果内表的数据量比较大,就可能出现这个

K:loosescan(m..n):5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个

除了这些之外,还有很多查询数据字典库,执行计划过程中就发现不可能存在结果的一些提示信息
11)、filtered
使用explain extended时会出现这个列,5.7之后的版本默认就有这个字段,不需要使用explain extended了。这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。

参考网址:
https://www.cnblogs.com/xiaoboluo768/p/5400990.html
https://www.cnblogs.com/usa007lhy/p/6444216.html

MySQL查询分析器EXPLAIN或DESC用法相关推荐

  1. MySQL查询分析器EXPLAIN

    explain介绍 位置: 放在SQL语句的最前面,如 explain select * from table; 格式化输出,在尾部加上\G explain结果解析 type,连接类型越往左边是越好的 ...

  2. mysql 查询分析器_mysql查询分析工具|mysql查询分析器(MySQL Query Browser)下载v1.1.20 官方版_ IT猫扑网...

    mysql查询分析器又名为mysqlquerybrowser,是一款可以帮助用户快捷进行sql语句查询的工具,让你在编程的过程中更加方便的进行工作.有需要的朋友就来IT猫扑下载吧! MySQL Que ...

  3. mysql 查询分析器

    mysql 查询分析器 类似sql的查询分析器 http://files.cnblogs.com/wangdetian168/mysqlquerybrowser.rar

  4. mysql 查询分析器中使用if_查询分析器中开发代码测试检查_MySQL

    如果您像我一样,则可能已经花费了很多时间在查询分析器中开发代码.在您对代码感到满意之后,可以立即对开发服务器上的测试数据库运行一个或两个专设 测试.如果看起来没有什么问题,您便可以将代码投入生产.如果 ...

  5. MySQL - 21查询分析器EXPLAIN

    explain简介 explain命令可以查看SQL语句的执行计划.当explain与SQL语句一起使用时,MySQL将显示来自 优化器的有关语句执行计划的信息.也就是说,MySQL解释了它将如何处理 ...

  6. mysql中查询分析器Explain的type的解释

    导语: 很多情况下,有很多人用各种select语句查询到了他们想要的数据后,往往便以为工作圆满结束了. 这些事情往往发生在一些学生亦或刚入职场但之前又没有很好数据库基础的小白身上,但所谓闻道有先后,只 ...

  7. mysql查询去重第一条_Mysql用法记录 - Ashley-OSCHINA的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.查询某个字段,在数据库不重复的条数(去重查询) select count(distinct item_uid) from supply_order; 查询 表 supply_order 中 ite ...

  8. mysql查询语句 变量_mysql查询语句中用户变量的使用

    先上代码吧 SELECT `notice`.`id` , `notice`.`fid` , `notice`.`has_read` , `notice`.`notice_time` , `notice ...

  9. mysql 查询结果怎么解读_MySQL查询优化之explain的深入解析

    在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...

最新文章

  1. 复制MySQL实时_自制mysql主从复制(实时)软件——实现
  2. 思科中国创新中心总部正式落户广州
  3. 华为机试题1:计算字符串最后一个单词的长度,单词以空格隔开。
  4. Android实例-手机震动(XE8+小米2)
  5. openlayer 3 在layer上添加feature
  6. kubernetes in action - Replication Controller
  7. SQL注入-联合注入
  8. 志愿者公交车上当导游(图)
  9. 警惕!不要让页面响应时间成为应用性能指标上的杠精
  10. osgEarth 加载矢量shp数据
  11. java 415_@RequestBody接受参数报415错误
  12. 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。
  13. mysql 分离和附加数据库_分离数据库和附加数据库有什么区别
  14. 微信小程序开通直播的条件
  15. 关于线性空间和线性映射
  16. 内存压力测试软件,TestMem5内存压力测试
  17. 如何更改Code::Blocks背景颜色(懒人版)
  18. html 如何把文字和图片放到一行,DIV+CSS图片和文字如何显示同一行
  19. visio移动变得很卡的解决办法
  20. 串起珍珠的链条——记腾讯SOSO团队

热门文章

  1. 关于互联网“毕业“的一些思考
  2. visual studio装哪些_全球有哪些院校的平面设计好?
  3. 短视频查重机制及去重方法
  4. Misc 图片中的图片
  5. 顶级科学家是哲学家,顶级investor是哲学家
  6. 【笔记】操作系统(六)——进程同步
  7. 原生js省市区三级联动
  8. 思科新版ccna认证网工一定要知道的PIM技术概述
  9. hive 三种去重方式
  10. 下单以及订单处理流程描述