SQL执行计划分析
解释
ID列
id标识sql语句中表的执行顺序,id越大越先执行;如果id相同,按照从上到下的顺序执行;如果id为null,表示当列是一个结果集
SELECT_TYPE
这一列显示了 对应行是简单还是复杂SELECT.取值如下:SIMPLE值意味着查询不包括子查询和UNION。查询有任何复杂的子部分,则最外层标记为PRIMARY.取值如下:
TABLE
显示的是查询的表名,如果该表使用了别名,那么这里就显示别名;如果不涉及对数据库表的操作,显示为null;如果显示为尖括号括起来的形式,<derivedN>就表示着是个临时表,后面的N代表执行计划中的id,表示结果来自于id对应的查询产生;<union M N> 和<derived N> 类似,表示结果来自于union 查询的id为M 和N 的结果集。
PARTITIONS
对于分区表,显示查询的分区ID,对于非分区表,显示为NULL
TYPE
除了all之外其他的type都可以使用到索引;除了index_merge 之外其他的type 都只能使用一个索引。
systm
表中只有一行数据或者是空表,并且表的引擎类型是myisam或memory;如果表的引擎是innodb,这种情况下type值为all
EXTRA
Tpe 和 extra 的实例文章 https://blog.****.net/taoy86/article/details/109036789
POSSIBLE_KEYS
指出MySQL能使用哪些索引来优化查询,查询所涉及的列上的索引都会被列出,但不一定会被使用
KEY
查询优化器优化查询实际所使用的索引,如果没有可用的索引,则显示为NULL,如查询使用了覆盖索引,则该索引仅出现在Key列中
KEY_LEN
该列表示每张表执行时使用到的索引的长度,长度越小越好。
REF
如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func
ROWS
表示执行计划中估计扫描的行数,是个估计值。
Filtered
表示返回结果的行数占需读取行数的百分比,Filter列的值越大越好
执行计划的限制
无法展示存储过程,触发器,UDF(自定义函数)对查询的影响
无法使用EXPLAIN对存储过程进行分析
早期版本的MySQL只支持对SELECT语句进行分析,如果想要分析UPDATE,INSERT语句需要将它们通过某种手段转换成SELECT语句。