一、语法
explain select ... ...
二、示例:
简单查询
三、各字段说明:
1、id:SQL的执行顺序,从大到小执行,如果id相同,则从上往下执行。
2、select_type:查询类型,有以下几种:
SIMPLE:简单select,不使用UNION和子查询。
PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY
UNION:
DEPENDENT UNION:
UNION RESULT:从UNION表获取结果的SELECT被标记为:UNION RESULT
SUBQUERY:在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY
DEPENDENT SUBQUERY:
DERIVED:在FROM列表中包含的子查询被标记为:DERIVED,若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在? FROM子句的子查询中,外层SELECT将被标记为:DERIVED
3、table:查询的哪张表
4、type:使用的那种查询类型,从最好到最差的连接类型为const、system、eq_reg、ref、range、index和ALL
ALL:全表扫描,从头到尾扫描整张表。
index:全索引扫描,按索引次序扫描表,其实还是全表扫描,主要优点是避免了排序,因为索引是排好序的。
range:索引范围扫描
ref:非唯一性索引扫描,返回匹配某个单独值的所有行
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
const,system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中, MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下, 使用system
5、possible_keys:当前查询能使用的索引
6、key:实际查询使用的索引。
7、key_len:使用的索引的长度,在不损失精确性的情况下,越短越好。
8、ref:用于连接查询,表示具体某个表的某列被引用。
9、rows:MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,这个值是不准确的,只有参考意义。
10、Extra:其他详细信息,含义:显示一些辅助的额外信息
a.Using index,表示使用了索引
b.Using where,表示通过where条件过滤
c.Using temporary,表示使用了临时表,常见于分组和排序
d.Using filesort,表示无法使用索引排序,需要文件排序
四、mysql执行计划的局限
1、EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
2、EXPLAIN不考虑各种Cache
3、EXPLAIN不能显示MySQL在执行查询时所作的优化工作
4、部分统计信息是估算的,并非精确值
5、EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划