这一列显示了mysql在索引里使用的字节数,通过这个值可以估算出具体使用了索引中的哪些列。
EXPLAIN SELECT * from film_actor where film_id =1;film_actor的联合索引idx_film_actor_id由film_id和actor_id两个id列组成,并且每个int是4字节。通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。
ken_len计算规则如下:
字符串
char(n):n字节长度
varchar(n):n字节存储字符串长度,如果是utf-8, 则长度是3n+2
数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节
时间类型
date:3字节
timestamp:4字节
datetime:8字节
如果字段允许为NULL,需要1字节记录是否为NULL
索引最大长度是768字节,当字符串过长时,MySQL会做一个类似做前缀索引的处理,将前半部分的字符串提取出来做索引。
这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有: const(常量),字段名等。一般是查询条件或关联条件中等号右边的值,如果是常量那么ref列是const,非常量的话ref列就是字段名。
EXPLAIN SELECT * from film_actor where film_id =1; row列这一列是mysql估计要读取并检测的行数,注意这个不是结果集的行数。
Extra列这一列是额外信息。
Using index:使用覆盖索引(结果集的字段是索引,即select后的film_id)
explain select film_id from film_actor where film_id=1;Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导的范围
explain select * from film_actor where film_id > 1;Using where:使用where语句来处理结果,查询的列未被索引覆盖
explain select * from actor where name ='a'Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般要进行优化,首先要想到是索引优化。
explain select DISTINCT name from actor;
actor.name没有索引,此时创建了临时表来处理distinct。
file.name建立了普通索引,此时查询时Extra是Using index,没有用到临时表。
Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。
explain select * from actor order by name;
actor.name未创建索引,会浏览acotr整个表,保存排序关键字name和对应id,然后排序name并检索行记录。
film.name建立了idx_name索引,此时查询时extra是Using index。
select tables optimized away:使用某些聚合函数(比如:max、min)来访问存在索引的某个字段
explain select min(id) from film ;