sql优化
explain
id
执行顺序,值越大执行优先级越高,相同则从上往下执行
select_type
简单/复杂查询
- simple 简单查询
- primary 复杂查询中最外层的 select
- subquery select 中的子查询(不在 from 子句中)
- derived from 中的子查询,结果放在临时表(派生表)中
table
被操作表
type
访问类型,system > const > eq_ref > ref > range > index > ALL
sql语句的优化主要看这里能到哪个级别,越高越好,index是最低最低最低要求了(当然如果是单张小表可能是All,可能走了索引还不如全表扫,如涉及到回表),如果能到前两个最好了
possible_keys
可能使用的索引
key
实际使用的索引
key_len
索引里使用的字节数,可以验证具体使用了索引中哪些列
比如8字节的有datetime/bigint,4字节的timestamp/int,3字节的date,1字节的tinyint,还有字符串varchar(n),以utf-8字符集为例,汉字类的为3n+2,英文数字类的n+2
ref
在key列记录的索引中
rows
MySQL预计要读取的行数,不一定是结果集里的真实行数
Extra
额外信息
- Using index 使用覆盖索引,不需回表即索引中包含了所有查询字段,这是最优结果
- Using where 使用 where 语句来处理结果,索引中不包含所有查询列需回表
- Using index condition 索引不能包含全部查询字段,回表之前会根据where条件在索引中进行过滤
- Using temporary 通过临时表来处理查询
- Using filesort 通过外部排序而不是索引排序,小数据量在内存排序,数据量较大时则要在磁盘中排序
- Select tables optimized away 使用聚合函数( max/min)来访问存在索引的某个字段