MySQL 执行计划简介

Posted Xuty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 执行计划简介相关的知识,希望对你有一定的参考价值。

一. id

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

二. select_type

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

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

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

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

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

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

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

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

三. type

依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL

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

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

eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。

ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质是也是一种索引访问,它返回所有匹配某个单独值的行,然而他可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体

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

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

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

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

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

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

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

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

四. key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)。

五. ref

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

六. rows

表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。

七. filtered

它指返回结果的行占需要读到的行(rows列的值)的百分比,越大越好。

八. Extra

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

Using where:表示mysql服务器将在存储引擎检索行后再进行过滤。许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where字句的查询都会显示"Using where"。

Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询

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

Using join buffer:该值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。

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

Using index condition:会先用条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行。

附录:

https://www.cnblogs.com/clsn/p/8087501.html#auto_id_29
https://dev.mysql.com/doc/refman/5.6/en/explain-output.html
https://www.cnblogs.com/xiaoboluo768/p/5400990.html

以上是关于MySQL 执行计划简介的主要内容,如果未能解决你的问题,请参考以下文章

MySQL执行计划都有那些规划?

MySQL执行计划都有那些规划?

MySQL数据库高级——事件

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

MySQL定时执行脚本(计划任务)实例

MySQL源码解析之执行计划