MySQL explain使用
1.介绍
EXPLAIN 命令用于SQL语句的查询执行计划。这条命令的输出结果能够让我们了解MySQL 优化器(optimlzer)是如何执行SQL 语句的。这条命令并没有提供任何调整建议,但它能够提供重要的信息帮助你做出调优决策。
下面执行连接查询语句
explain select * from goods_goods inner join goods_goodscategory on goods_goods.category_id = goods_goodscategory.id;

接下来我们来逐一分析该结果各字段(id、 select,、table、 partitions、possible_keys、key、key_len、ref、rows、filtered、extra)含义
为测试准备两张表:
2. explain之id
id表示了DML中所涉及表的查询顺序,值越大表示越先执行,值相同时,从上至下执行
explain select * from goods_goods g where g.id = (select distinct category_id from goods_goodscategory where id=100);

3. explain之select_type
select_type 列提供了 对表的查询类型。最常见的值包括SIMPLE、PRIMARY、DERIVED 和UNION。其他可能的值还有 UNION RESULT、SUBQUERY 等等.
SIMPLE:
不包含子查询和其他复杂语法的简单查询,(包含join)

PRIMARY:
在存在子查询的语句中,最外面的select查询就是primary
explain select * from goods_goods g where g.id = (select distinct category_id from goods_goodscategory where id=100);

SUBQUERY:
在select或where列表中包含了子查询
DERIVED:
在from列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,并把结果放在临时表中。
explain select id from (select * from goods_goods where id<10);
错误:
为from后的表取别名后才能执行正确,该处的from子句后的表就是一个临时表
explain select id from (select * from goods_goods where id<10) as new_table;
UNION:
第二个select出现union之后,则被标记为union,若union包含在from子句的子查询中,外层select被标记为derived;
explain select * from (select 1 as A union select 2 as B) as newt;

UNION RESULT:
从union表中获取结果的select
4. explain之type
type所涉及的值主要有如下几种取值:
| 最好----->最差 | system | const | eq_ref | ref | range | index | all |
全部值集有:
| 最好----->最差 | system | const | eq_ref | ref | fulltext | ref_or_null | index_merge | unique_subquery | index_subquery | range | index | all |
一般来说,得保证查询至少达到range级别,最好能达到ref
system:
表只有一行记录(等于系统表),这是const类型的特例,怕是不会出现,这个也可以忽略不计。
const:
表示通过索引一次就找到了,const用于比较primary key或者unique索引,因为只匹配一行数据,所以很快,如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
explain select * from (select * from goods_goods where id = 1) nt;

内层的select为const,通过主键只匹配了一行数据,其结果作为临时表交由外层select查询,所以外层的select查询的type就是system,因为临时表只有一行数据。
eq_ref:
唯一性索引扫描,对于每个索引键,表中只有一行数据与之匹配。常见于主键或唯一索引扫描

explain select * from ref_student s, ref_major m where s.major=m.id;

注意:如果此时ref_student中存在多条记录,则该TYPE就是ALL了,如果ref_student中只有一条记录,但ref_major有多条记录,则还是EQ_REF类型
意思就是说,主表与从表通过外键A关联,在主表中可能存在多条记录,但从表的记录只有一条
ref:
出现该连接类型的条件是: 查找条件列使用了索引而且不为主键和unique。其实,意思就是虽然使用了索引,但该索引列的值并不唯一,有重复。这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。但它的好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在一个非常小的范围内扫描。下面为了演示这种情形,给employee表中的name列添加一个普通的key(值允许重复)
alter table mstudent add key idx_name(name); #为name字段添加非唯一性索引


range:
范围查找,例如在where子句后添加条件范围(IN、BETWEEN、>、<、OR等等)
index:
基于索引进行全表扫描

5. explain之type、key、key_len、rows、ref等
possible_keys:
显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引项被列出,但不一定被查询实际使用。
key:
实际使用的索引,若为null,则没有使用到索引。(两种可能,①没建立索引。②建立索引,但索引失效)。查询中若使用了覆盖索引,则该索引仅出现在key列表中。
key_len:
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确型的情况下,长度越短越好,key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据定义计算而得,不是通过表内检索出的。
rows:
每张表有多少行被mysql优化器查询
ref:
引用到的上一个表的列,
6. explain之extra
包含不适合在其他列中显示,但又十分重要的信息,其主要取值参数如下:
using filesort:
当Query 中包含 ORDER BY 操作,而且无法利用索引完成排序操作的时候,MySQL Query Optimizer 不得不选择相应的排序算法来实现。数据较少时从内存排序,否则从磁盘排序。Explain不会显示的告诉客户端用哪种排序。官方解释:“MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行”

前者使用了额外的排序,后者使用自建的索引排序,后者性能优于前者
using temporary:
使用了临时表保存了中间结果,MySQL在对结果排序时使用了临时表,常见于group by和order by;
group by后尽量基于where子句后的索引来进行分组
using index:
覆盖索引:select数据列只用从索引中就能取得,不必读取数据行。
表示相应select操作中使用了覆盖索引,避免了访问表的数据行,效率高,
如果同时出现using where,表明索引被用来执行索引键值的查找
如果没有同事出现using where,表明索引用来读取数据而非执行查找动作

impossible where:
where子句后的条件逻辑错误
MySQL explain使用的更多相关文章
- 【转载】 mysql explain用法
转载链接: mysql explain用法 官网说明: http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 参数: htt ...
- 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的执行计划的时候,EXPLAIN语句跑了2分钟.SQL命令类似: SELECT * FROM (SELECT USERID,COUNT(*) FROM TBNAME GROUP ...
- [转]MySQL Explain详解
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...
- mysql explain 命令讲解
explian命令可以显示select语句的执行计划 explain的结果中每行对应select语句中的一个表,输出结果中的顺序是按照语句处理表的顺序. mysql使用嵌套循环来处理所有的join连接 ...
- mysql explain输出中type的取值说明
原文: http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html 这列很重要,显示了连接使用了哪种连接类别,有无使用索引. 从最好 ...
- mysql explain用法和结果的含义(转)
重点是第二种用法,需要深入的了解. 先看一个例子: mysql> explain select * from t_order; +----+-------------+---------+--- ...
- [mysql] mysql explain 使用
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 先解析一条sql语句,看出现什么内容 EXPLAINSELECTs.uid, ...
随机推荐
- AWS成本估算的相关小工具
1.AWS-partner :云势数据做的在线小工具,有微信版本可以使用,但是涉及的服务很少,更新慢,型号缺,界面不友好.不是很理想,连接如下: https://www.goclouds.cn ...
- tf.nn.softmax_cross_entropy_with_logits()函数的使用方法
import tensorflow as tf labels = [[0.2,0.3,0.5], [0.1,0.6,0.3]]logits = [[2,0.5,1], [0.1,1,3]] a=tf. ...
- Doctype作用,标准模式与兼容模式的区别
<!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器用什么文档标准解析这个文档.DOCTYPE不存在或格式不正确会导致文档以 ...
- 如何查看服务器对外的IP
开发的时候经常会被IP受限,这是由于数据源方限制了IP,所以需要报备一下IP白名单,怎么查看自己的网络对外的IP呢? 用下面的方式最为准确: Windows上操作: 直接再浏览器访问 http://h ...
- php 弹窗案例
<?php // 弹出对话框并且返回原来的页面 echo "<script language=\"JavaScript\">\r\n"; ec ...
- Python学习日记(三十五) Mysql数据库篇 三
使用Navicate 创建一个连接去使用Mysql的数据库,连接名可以取任意字符但是要有意义 新增一个数据库 填写新数据库名,设置它的字符集和排序规则 新建一个表 增加表中的信息 点击保存再去输入表名 ...
- angular官网实例(综合)
第一部分: (应用的“外壳”) 1.新建项目: ng new mytest 2.进入项目目录,并启动这个应用. cd mytest ng serve --open 3.添加一个标题 打开 app.co ...
- 数据库开发-Django ORM的单表查询
数据库开发-Django ORM的单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询集 1>.查询集相关概述 查询会返回结果的集,它是django.db.mod ...
- MySQL/MariaDB数据库的性能测试
MySQL/MariaDB数据库的性能测试 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据库服务衡量指标 qps: query per second(每秒支持多少查询 ...
- MySQL/MariaDB数据库的冷备份和还原
MySQL/MariaDB数据库的冷备份和还原 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL/MariaDB数据库的备份和还原概述 1>.为什么要备份 为了 ...