倚楼听风雨
淡看江湖路

MySQL中执行explain命令后显示的各个字段都是什么含义?

20180925更新:

由于这篇文章基本是参考的网上的信息整理而成,再次翻阅感觉某些东西解释的不算清楚,所以趁着今天有那么一点点的时间再把语言重新组织一下,内容均来源于书籍《;深入浅出MySQL: 数据库开发、优化与管理维护》,同时搞DBA或者经常使用MySQL开发的同仁建议你们购买看看,也还是很有帮助滴。

----------------丑逼分割线----------------

不管他三七二十一,再次开一个坑,这次开始坑MySQL,随着工作经验的不断积累,sql语句再也不能xjb写了,总是要注意优化,注意效率,注意规范,话说孤尽的MySQL规范老四还没开始解析呢!!!在sql优化的过程中我们不可避免的要使用explain命令来查看自己写的sql是如何执行的,查看使用了什么索引,全表扫描还是索引扫描等。对于刚开始接触的时候,一小部分人可能对explain的各个字段的含义有不清楚的地方,于是记录一下,也留待我日后复习使用。废话少说,先上一张结果图,工具为Navicat。说起它,老四改天会把Navicat的最新破解版以及破解方式发出来。

当我们定位到执行效率低的SQ语句之后,我们可以通过EXPLAIN或者DESC命令来查看MySQL到底是如何解析并执行SELECT等语句的。当你点击那个解释按钮的时候或者将你的SQL前面加上 "exolain"命令,mysql就为你显示以上一张表的查询结果,今天要记录的就是explain命令执行之后各个字段的都有哪些值,这些值都是什么含义,这些字段又都是表达什么特征的。来一张表,直观一点。

字段名称
字段含义
字段值及其含义
id
查询序列号,explain解释这条sql的
查询序列号
select_type
标识select的类型,查询类型
simple:简单查询,即不使用union或者子查询
primary:主查询,即外层的select查询
union:union中第二个或者后面的select查询语句
dependentunion:同上,但是取决于外层的select
union result:union的结果
subquery:子查询中的第一个select查询语句
dependent subquery:同上,但是取决于外层的select
derived:导出表的select,子查询
(可能看不太懂,其实我也不太懂,大概理解就行,他就是告诉你当前的sql是怎么查询数据的)
table
就是查询都去用了那几张表,在你的语句中都已经有所体现了
输出结果集的表
partitions
代表表使用的分区,关于mysql表分区,你可以简单理解为为了存储数据,mysql
将数据按照水平或者垂直将表分区存储,查询的时候从相应的区块中取出来
type
表示MySQL在表中找到所需行的方式,或者叫访问类型,以下类型从左到右性能由最差到最好: ALL->index->range->ref->eq-ref->const,system->NULL
system: 单表中最多有一个匹配行,查询起来非常迅速,所以这个匹配行中的其他列的值可以被优化器在当前查询中当作常量来处理。
const: 上面的system就属于const的特例,描述的是表只有一行数据,在查询开始的时候就被读取
eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配;简单来说,就是多表连接中使用primary_key(主键)或者unique_index作为关联条件。
ref: 使用非唯一索引扫描的前缀扫描,返回匹配某个单独的记录行,ref还经常出现在join中。
ref_or_null: 与ref类似,区别在于条件中包含对NULL的查询
index_merge: 索引合并优化
unique_subquery: in的后面是一个查询主键字段的子查询
index_subquery: 与unique_subquery类似,区别在于in的后面是查询非唯一索引字段的子查询
range: 索引范围扫描,常见于<、≤、>、≥、between等操作符
index: 索引全扫描,MySQL遍历整个索引来查询匹配的行
ALL: 全表扫描,MySQL遍历全表来找到匹配的行
NULL: MySQL不用访问表或者索引,直接就能够得到结果。
possible_keys
表示查询时可能使用的索引
key
表示实际使用的索引
key_len
使用到索引字段的长度
ref
告诉你除了索引以外,他还用了那个列帮你查询数据
rows
扫描行的数量
filtered
告诉你通过你的where条件它帮你过滤的多少没必要的数据的百分比
extra
执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息
distinct:发现第一个匹配行之后就停止匹配
not exists:为左连接查询优化,发现一个左连接的匹配的行就停止
range checked for each record(index map):没有好的索引可以使用
using filesort:按排序检索
using index:只查索引
using temporary:为了解决查询,mysql需要创建一个临时表帮助解决问题
using where:使用where条件来限制数据行或者其他数据表的查询
using sort_union,using union,using interesect,这些都是函数,告诉你他们试如何为索引合并服务的
using index for group by:同 using index,但是恰巧还可以用在group by的列上面

除此以外,还有explain extended命令,通过该命令再加上show warnings,我们可以看到SQL执行之前优化器对SQL做了哪些SQL的优化以及改写,最早filtered字段就是在extended中,但是现在explain中也有体现了,比如我们经常用到1=1的恒等条件都会被优化器自动去掉等。

更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请赞助盒烟钱,点我去赞助。抱拳。

赞(7) 给你买杜蕾斯
本站原创文章受自媒体平台原创保护,未经允许不得转载高老四博客 » MySQL中执行explain命令后显示的各个字段都是什么含义?
分享到: 更多 (0)

开始你的表演 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下老四,鼓励我更好的创作

支付宝扫一扫打赏

微信扫一扫打赏