explain执行计划中的字段以及含义在下面的博客中有详细讲述:
https://blog.csdn.net/da_guo_li/article/details/79008016
执行计划能告诉我们什么?
EXPLAIN命令是查看查询优化器如何决定执行查询的主要的方法,学会解释EXPLAIN将帮助我们了解SQL优化器是如何工作的。执行计划可以告诉我们SQL如何使用索引,连接查询的执行顺序,查询的数据行数。
下面是一个简单EXPLAIN的结果:
执行计划重点关注 type、key、key_len、rows、extra
type:type如果为ALL,表示全盘扫描,也是效率最低的
key:表示使用了哪个索引,如果没有使用为null
key_len:表示索引字段的最大可能长度,KEY_LEN的长度由字段定义计算而来,并非数据的实际长度,长度越小,效率越高。
主要是看复合索引用到了哪些列 因为很多复合索引可能只是用到了一列或者某几列,联合索引是从左往右来的,算到什么地方,就代表用哪一列
假如有一个表 id int not null ,name varchar(32) not null 并且是utf8字符类型的表 假如索引是id_name 如果只用到id列那么key_len 就是4 如果两列
都用到了那 key_len 就是 4+32*3+2 如果不是not null 就是4+1+32*3+2+1了
rows:表示MySQL通过哪些列或常量被用于查找索引列上的值,ROWS值的大小是个统计抽样结果,并不十分准确。全盘扫描时,值最大,接近表中数据行数。建议值小于5000
extra:如果出现using filesort 表示sql中有排序。应尽量避免在磁盘中排序。让其尽量通过索引字段排序。
以下是执行计划中的字段的详细解释:
原文出处:
https://blog.csdn.net/da_guo_li/article/details/79008016
分析执行计划中EXPLAIN的列
ID列
是一位数字,表示执行SELECT语句的顺序。
id值相同执行顺序从上到下。
id值不同时id值大的先执行。SELECT_TYPE这一列显示了对应行是简单还是复杂SELECT.取值如下:SIMPLE值意味着查询不包括子查询和UNION。查询有任何复杂的子部分,则最外层标记为PRIMARY.取值如下:![]()
TABLE
输出数据行所在的表的名称
![]()
PARTITIONS
对于分区表,显示查询的分区ID,对于非分区表,显示为NULL
TYPE
EXTRA
![]()
POSSIBLE_KEYS
指出MySQL能使用哪些索引来优化查询,查询所涉及的列上的索引都会被列出,但不一定会被使用
KEY
查询优化器优化查询实际所使用的索引,如果没有可用的索引,则显示为NULL,如查询使用了覆盖索引,则该索引仅出现在Key列中
KEY_LEN
表示索引字段的最大可能长度,KEY_LEN的长度由字段定义计算而来,并非数据的实际长度
REF
表示哪些列或常量被用于查找索引列上的值
ROWS
表示MySQL通过哪些列或常量被用于查找索引列上的值,ROWS值的大小是个统计抽样结果,并不十分准确
Filtered
表示返回结果的行数占需读取行数的百分比,Filter列的值越大越
无法展示存储过程,触发器,UDF对查询的影响无法使用EXPLAIN对存储过程进行分析
早期版本的MySQL只支持对SELECT语句进行分析,如果想要分析UPDATE,INSERT语句需要将它们通过某种手段转换成SELECT语句。
具体sql优化推荐案例:
http://www.cnblogs.com/tangyanbo/p/4462734.html#!comments