1、id
id不是唯一标识,是执行的优先级,id越大,优先级越高。id如果想等,谁在前面谁先执行
2、select_type:
simple:简单查询,不包含子查询和union
primary:复杂查询中最外层的select
subquery:包含在select中的子查询(不在from中)derived:包含在from子句中的查询。Mysql会将结果放在一个临时表中,也称为派生表(derived的英文含义)
3、type
这一列表示关联类型或者访问类型,即mysql决定如何查找表的行,查找数据行记录的大概范围
依次从最优到最差分别为:system>const>eq_ref>ref>range>index>all(全表扫描)
一般来说,要保证达到range级别,最好达到ref
NULL:mysql能够在优化节点分解查询语句,在执行节点用不着在访问表或索引。例如:
要在执行时访问表:
1、const和system
mysql能对查询的某些部分进行优化并转为一个常量(show warnings可以查看),用于primary key或者unique key的所有列和常数比较时。表最多有一个匹配行,读取一次,速度比较快。其中system时const的特例,表中只有一条元素匹配时为system
2、eq_ref
primary_key或者unique_key索引的所有部分被连接使用,最多返回一条符合条件的记录。
3、ref
ref不使用唯一索引,而使用普通索引或者唯一索引的部分前缀,索引要和某个值比较,可能会找到多个符合条件的行。
1、select查询,name是普通索引
2、关联表查询
idx_film_actor_id是film_id和actor_id的联合索引,这里使用到了filme_actor的左边前缀fim_id部分。
3、range
范围扫描通常在in(),between,等操作中,使用一个索引来检索给定范围的行。
4、index
扫描全索引就能得到结果,一般是扫描某一二级索引,这种扫描不会从索引的根节点开始快速查找,而实直接对二级索引的叶子节点遍历和扫描,速度较慢,这种查询一般是覆盖索引,二级索引一般比较小,比all快
5、all
全表扫描,扫描聚簇索引的所有叶子节点
4、posiable_key,key
分别代表sql在分析时可能使用的索引和实际使用的索引。
5、key_len
显示的是mysql在索引中使用的字节数,通过这个数值可以算出具体使用了索引中的哪些列
计算规则如下:
- 字符串
- char(n):n代表长度
- varchar(n):如果是utf-8,长度为3n+2,加的2字节用来存储字符串长度
- 数值类型
- tinyint:1字节
- smallint:2字节
- int:4字节
- bigint:8字节
- 时间类型
- date:3字节
- datetime:4字节
- timestamp:4字节
- 如果字段允许为null,需要1个字节记录是否为null
索引的最大长度为768字节,当字符串过长时,mysql会做一个类似做一个左缀索引的处理,将前半部分的字符提取出来左索引
6、Extra列
- Using index:使用覆盖索引
- 覆盖索引定义:mysql执行计划explain结果中的key有使用索引,如果select后面查询的字段都可以从这个索引的树中获取,一般可以说用到了覆盖索引,extra里一般都有using index;覆盖索引一般针对的是辅助索引,整个查询结果只通过辅助索引就能拿到结果;不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段
- Using where:使用where语句来处理结果,并且查询的列并未被索引覆盖
- Using index condition:查询的列不完全被索引覆盖,where条件时一个前导列的范围
- Using temporary: mysql需要创建一张临时表来处理查询。出现这种情况一般需要优化,首先使用索引优化
- Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。
- Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段