附录MySQL Explain.md

MySQL Explain

调用explain

  1. 可以使用explain extended语句,在执行完计划后,使用show warnings,可以看到解释后执行的sql语句
  2. explain partitions会现实查询将访问的分区
  3. 如果执行explain时,from子句中含有子查询,那么此时执行计划是会执行子查询的,然后完成外层查询优化

explain的限制

  1. 只是近似结果,且不会显示所有信息
  2. 不会西纳斯触发器、存储过程或UDF如何影响查询
  3. 不显示在执行查询中所做的特定优化
  4. 不区分有相同名字的事务,比如对内存排序和临时文件都使用filesort。且对磁盘和内存中的文件都显示Using temporary

explain中的列

主要有id、select_type、table\possible_keys、key、filterlist、Extra、type、key_len、ref、rows

id列

编号,标志select所属的行,如果没有子查询,则都为1;一层子查询为2;二层子查询为3。

当使用UNION时,结果总时存放在一个匿名临时表总,之后将结果读到临时表外。临时表并不在原SQL中出现,因此id列时NULL

select_type列

mysql将select分为简单和复制查询,复杂分为三类:简单子查询、派生表(在from子句中的子查询)、UNION查询。

SIMPLE:如果不包含子查询和UNION,则为SIMPLE

PRIMARY:查询含有复杂子部分,则外层标记为PRIMARY。内层可以为:SUBQUERY/DERIVED/UNION/UNION RESULT

SUBQUERY:包含在SELECT列表中的子查询中的SELECT(不在FROM子句中)

DERIVED:包含在FROM子句中的子查询中的select

UNION:在UNION中的第二个和随后的selet被标记为UNION,第一个作为外查询来执行。

UNION RESULT:从UNION的匿名临时表检索结果的select

此外:SUBQUERY与UNION还会被标记为DEPENDENT和UNCACHEAABLE,前者表示select依赖外层查询中发现的数据。后者表示select中的某些特性阻止结果被缓存在一个Item_cache中

table列

表示被访问的表名或则别名。mysql查询执行计划总是左侧深度优先树,其叶子节点直接对应于EXPLAIN中的行。

当FROM子句中有子查询或UNION时,table列会变得复杂,此时会产生匿名临时表仅在查询执行计划中存在。

当from查询中含有子查询时,table列为<derivedN>,其中N是子查询id,也就是N指向EXPLAIN输出中后面的一行。

type列

表示关联的类型,mysql决定如何查找表中的行

ALL:全表扫描,从头到尾,依次查找需要的行

index:与全表扫描一样,只是mysql扫描表时按照索引次序进行,而不是行,避免了排序,但是仍然需要读取整个表的开销。如果在Extra列使用”Using index"表示正在使用覆盖扫描

range:有限制的索引扫描,开始于索引中某个点,用不着遍历全部索引

ref:索引访问,它返回所有匹配单个值的行,然后查找多个符合条件的行。只有当使用非唯一索引或者唯一索引的非唯一前缀才会发生

eq_ref:mysql最多返回一条符合条件的记录。可以在mysql使用主键或者唯一性索引查找时看到,找到一条记录后无需再次进行查找

const,system:对查询的某部分进行优化并将其转换成常量。比如通过将某一行的主键放在where子句中来选取此行的主键,那么就会把这个查询转换为一个常量,然后将表从连接执行中移除

NULL:表示mysql在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。比如,从一个索引列中选取最小值可以通过单独索引来完成,不需要再执行时访问表

possible_keys列

查询时可能用到的索引列,对于后期的优化过程可能没有扫描用。它是基于查询访问的列和使用的比较操作符来判断的

key列

mysql决定采用哪个索引来优化对该表的访问。实际使用的索引,若为null,则没有使用到索引。(两种可能,①没建立索引。②建立索引,但索引失效)。查询中若使用了覆盖索引,则该索引仅出现在key列表中。

key_len列

显示mysql在索引中使用的字节数。根据的是表定义计算,而不是表中的数据。

ref列

如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func

rows列

为了找到所需的行而要读取的行数,这个数字是内嵌循环关联计划中的循环数目。也就是它并不是mysql认为它最终要从表中读取出来的行数。

filterlist列

显示的是针对表里符合某个条件(where子句或关联条件)的记录数的百分比所做的悲观估算

Extra列

包含不适合在其他列显示的额外信息:

  1. Using index:表示使用覆盖索引
  2. Using where:在存储引擎检索行后,再进行过滤
  3. Using temporary:对查询结果排序时使用一个临时表
  4. Using filesort:mysql对结果使用一个外部索引排序,而不是按照索引次序从表里读出行。也就是排序时不能使用索引进行优化。

树形结构的Explain

percona-toolkit简称“PT工具”,是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务。其中的pt-visual-explain工具可以展示树形结构的执行计划。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值