MYSQL性能分析之explain分析SQL执行计划



1. ID
一组数字,操作顺序,如果id相同,则执行顺序由上至下,如果是子查询,id的序号递增,值越大优先级越高,越先被执行;

2. select_type
每个字句的类型,简单还是复杂

  • simple :简单查询,无子查询或union等;
  • primary:查询中若包含复杂的子部分,最外层则被标记为primary;
  • subquery:在select或where中若包含子查询,则该子查询被标记为subquery;
  • derived:from中包含子查询,被标记为derived;
  • union:若select出现在union之后,则被标记为union;
  • union result:从union表中获取结果的select将被标记为union result;

3. table
查询的数据库表名称

4. type
联合查询使用的类型

  • system: 表中只有一行数据,且只能用于myisam和memory表 → 效率最高
    myisam&memory engine: alter table t4 engine=myisam; >> explain select * from t4 where id=1;
  • const: 使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const,其他数据库也叫做唯一索引扫描
    添加唯一索引:alter table t4 add unique(id); >> explain select * from t4 where id=1;
  • eq_ref: 多表连接查看中唯一索引或主键扫描 >> 唯一一条数据
  • ref: 非唯一性索引扫描,交返回匹配单独值的所有行,常见于使用非唯一性索引或唯一性索引的非唯一前缀进行的查找。
  • range: 索引范围扫描
  • index: 全表扫描,只是扫描表的时候按照索引次序 进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大【需优化】
  • all: 全表扫描【需优化】

5. possible_keys
指出mysql能使用哪个索引在表中找到行,查询涉及的字段上若存在索引,则该索引将被列出。如果为空,说明没有可用的索引

6. key
使用到了哪个索引,这里列出的是实际使用到的索引,若没有使用索引,则显示为null。

7. key_len
使用的索引的长度。在不损失精确性的情况 下,长度越短越好。

8. ref
显示索引的哪一列被使用了

9. rows
MYSQL 认为必须检查的用来返回请求数据的行数.找到所需记录,需要读取的行数,越少越好

10. Extra

  • Using index:使用了索引检索。  
  • where used:使用了where限制,但是用索引还不够。  
  • Using temporary:需要使用临时表来存储结果集,常见于排序和分组查询。性能差。  
  • Using filesoft:使用了文件排序,性能差。