文档章节

explain详解

周慕云
 周慕云
发布于 06/25 19:01
字数 1256
阅读 18
收藏 0

EXPLAIN列的解释

table

显示这一行的数据是关于哪张表的

type

这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为

  • const(读常量,最多只会有一条记录匹配,由于是常量,实际上只须要读一次。
  • eq_reg(最多只会有一条匹配结果,一般是通过主键或唯一键索引来访问
  • ref(Join语句中被驱动表索引引用的查询
  • range(索引范围扫描
  • index(全索引扫描
  • ALL(全表扫描

 

    非InnoDB的一些值解释

  • index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行合并(merge),再读取表数据
  • index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引

  • ref_or_null:与ref的唯一区别就是在使用索引引用的查询之外再增加一个空值的查询

  • system:系统表,表中只有一行数据

  • unique_subquery:子查询中的返回结果字段组合是主键或唯一约束

     

     

     

possible_keys

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

key

实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len

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

ref

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

rows 

MYSQL认为必须检查的用来返回请求数据的行数

Extra

关于MYSQL如何解析查询的额外信息

  • Distinct:查找distinct 值,当mysql找到了第一条匹配的结果时,将停止该值的查询,转为后面其他值查询。
  • Full scan on NULL key:子查询中的一种优化方式,主要在遇到无法通过索引访问null值的使用。
  • Range checked for each record (index map: N):通过 MySQL 官方手册的描述,当 MySQL Query Optimizer 没有发现好的可以使用的索引时,如果发现前面表的列值已知,部分索引可以使用。对前面表的每个行组合,MySQL检查是否可以使用range或 index_merge访问方法来索取行。
  • SELECT tables optimized away:当我们使用某些聚合函数来访问存在索引的某个字段时,MySQL Query Optimizer 会通过索引直接一次定位到所需的数据行完成整个查询。当然,前提是在 Query 中不能有 GROUP BY 操作。如使用MIN()或MAX()的时候。
  • Using filesort:当Query 中包含 ORDER BY 操作,而且无法利用索引完成排序操作的时候,MySQL Query Optimizer 不得不选择相应的排序算法来实现。
  • Using index:所需数据只需在 Index 即可全部获得,不须要再到表中取数据。
  • Using index for group-by:数据访问和 Using index 一样,所需数据只须要读取索引,当Query 中使用GROUP BY或DISTINCT 子句时,如果分组字段也在索引中,Extra中的信息就会是 Using index for group-by。
  • Using temporary:当 MySQL 在某些操作中必须使用临时表时,在 Extra 信息中就会出现Using temporary 。主要常见于 GROUP BY 和 ORDER BY 等操作中。
  • Using where:如果不读取表的所有数据,或不是仅仅通过索引就可以获取所有需要的数据,则会出现 Using where 信息。
  • Using where with pushed condition:这是一个仅仅在 NDBCluster存储引擎中才会出现的信息,而且还须要通过打开 Condition Pushdown 优化功能才可能被使用。控制参数为 engine_condition_pushdown 。
  • Impossible WHERE noticed after reading const tables:MySQL Query Optimizer 通过收集到的统计信息判断出不可能存在结果。
  • No tables:Query 语句中使用 FROM DUAL或不包含任何 FROM子句。
  • Not exists:在某些左连接中,MySQL Query Optimizer通过改变原有 Query 的组成而使用的优化方法,可以部分减少数据访问次数。

filtered (JSON name: filtered)

如果你用EXPLAIN EXTENDED将会展示出这列filtered(MySQL5.7缺省就会输出filtered),它指返回结果的行占需要读到的行(rows列的值)的百分比。filtered是个非常有用的值,因为对于join操作,前一个表的结果集大小直接影响了循环的次数。

 

© 著作权归作者所有

上一篇: 索引学习笔记
下一篇: sleep和wait的区别
周慕云
粉丝 5
博文 64
码字总数 35326
作品 0
海淀
程序员
私信 提问
一条面试题目比较经典不看手册,你会吗?

列举Mysql中explain命令中各列详解?

RickyFeng
2012/01/10
788
5
mysql explain 详解

对于经常使用mysql的兄弟们,对explain一定不会陌生。当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联合和以什么次序的信息。借助于EXPLAIN,你可...

vga
2016/08/25
56
0
面试前必须知道的MySQL命令【explain】

只有光头才能变强 刷面试题的时候,不知道你们有没有见过MySQL这两个命令:和(反正我就见过了).. 之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。今天发现自己的有这么两个命令,...

Java3y
2018/12/06
0
0
Mysql Explain 详解

Mysql Explain 详解 一.语法 explain < tablename > 例如: explain select * from t3 where id=3952602; 二.explain输出解释 +----+-------------+-------+-------+-------------------+----......

java-苦苦甜甜
2014/03/18
0
0
MYSQL explain详解

http://blog.csdn.net/zhuxineli/article/details/14455029 explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 先解析一条sql语句...

chencheng192
2017/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式Session的实现方式

JWT Token 使用 JWT Token 储存用户身份,然后再从数据库或者 cache 中获取其他的信息。这样无论请求分配到哪个服务器都无所谓。 Tomcat + Redis 在 tomcat 的配置文件中配置: <Valve class...

禅明
21分钟前
0
0
Android饼图 PieChart

PieChart 饼图,android 图表。会根据定义PieChartView的大小自动居中,所以如果要调整位置,只需要在xml更改PieChartView位置大小即可。 https://github.com/ccMagic/PieChart 1、先看一下效...

ccMagic
25分钟前
3
0
说说我当初是如何学Linux的

今天我就说说我当初是如何从一名普通桌面维护工程师,通过学习和努力转成Linux运维工程师的,以及作为Linux运维工程师需要一些什么技能和知识,希望可以帮到一些对Linux有兴趣或者想往Linux...

Linux就该这么学
25分钟前
2
0
Tomcat启动异常Unable to register MBean [HikariDataSource (null)]:InstanceAlreadyExistsException

Unable to register MBean [HikariDataSource (null)] with key 'xxx'; nested exception is javax.management.InstanceAlreadyExistsException: com.zaxxer.hik ari:name=baseDataSource,ty......

sunranhou
31分钟前
2
0
qt从普通线程发信号到UI线程

加入从当前一个普通线程发送信号到ui,更新Ui只能使用Qt::BlockingQueuedConnection,用Qt::QueuedConnection会一会有用一会没用,并且会导致崩溃。 connect(this, &Task::startTask, this, ...

青黑
51分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部