一、联合 show warnings使用
在explain语句后使用,可打印优化器优化后的sql语句
二、explain列
id列:要执行的sql语句数量,id值越大优先级越高
select_type列:为简单查询还说复杂查询
1.SIMPLE:简单查询,不包括子查询
2.PRIMARY:复杂查询外层查询
3.DEPENDENT SUBQUERY:复杂查找中子查询,不在from中
4.DERIVED:复杂查询中子查询,在from中
5.UNION:使用union或者union all查询后,union后的查询 ;
union和union all区别:union会合并相同结果
注: set session optimizer_switch='derived_merge=on';开启衍生表的合并优化,mysql5.7之后默认开启
set session optimizer_switch='derived_merge=off';关闭衍生表的合并优化
table列: 表示访问的表名。若为<derivedN>表示临时表,依赖于id=N的表查询
type列:表示关联类型和访问类型,即sql访问级别
访问级别性能从高到低为:system-->const-->eq_ref-->ref-->range-->index-->all
若级别在range之后则考虑sql优化
若为NULL则表示不访问表或者索引
system,const:表中只有一条匹配记录
eq_ref:使用主键或唯一索引连接查询最多返回一条匹配记录
ref:不使用主键或者唯一索引连接查询,使用普通索引查询
range:出现在in between > < =等查询中,并且使用索引查询
index:扫描全索引,一般为扫描二级索引所有叶子节点
all:扫描全表,一般为扫描了聚簇索引所有叶子节点
possible_key列: 可能用到的索引
key列:实际用到的索引
key_len列:使用的索引字节数
1.字符串 char(n):n个字节长度 varcher(n):若为UTF-8,则长度为3n+2
2.数字 tinyint:1字节长度 smallint :2字节长度 int:4字节长度 bigint:8字节长度
3.时间类型:date :3字节长度 timestamp :4字节长度 datetime:8字节长度
4.若字段可以为null,则要要多1字节存储是否为null
ref列:使用索引时用到的列或常量 const为常量,字段名字
rows列:预计读取的行数。不为最终读取行数,仅为优化器执行时预计行数
Extra列:条件信息
1.Using index:使用覆盖索引
2.Using where :使用where条件,查询列未被索引覆盖
3.Using index condition:使用二级索引,并为范围查询
4.Using temporary:需要创建临时表处理查询,考虑用覆盖索引优化
5.Using filesort:外部排序,数据少时候使用内存排序,数据大时则使用磁盘排序
6.select table optimized away:使用了聚合函数