MySQL-explain

explain分析

explain命令是查看优化器如何决定执行查询的主要方法,在查询语句前加explain即可

explain select * from t where c1 = (select id from t2 where id = 10);

| id |select_type|table|partitions| type | possible_keys | key | key_len | ref |rows| filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+---------+
| 1 | PRIMARY    | t    | NULL    | const | PRIMARY      | PRIMARY | 4  | const | 1 | 100.00   | NULL |
| 2 | SUBQUERY   | t2   | NULL    | const | PRIMARY      | PRIMARY | 4  | const   1 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+---------+

id:表示表的读取顺序或查询中执行select子句的顺序

  • id相同,可以认为是一组的,执行顺序由上至下
  • id不同,如果是子查询,id序列号会递增,id值越大优先级越大,越先被执行

select_type:表示select的类型,主要用于区别普通查询、联合查询、子查询等复杂查询

  • simple:简单的select查询,查询中不包括子查询或union
  • primary:查询中若包含任何复杂的子部分,最外层查询标记为primary
  • subquery:select或where列表中的子查询
  • derived:衍生,在form列表中包含子查询,MySQL会递归执行这些子查询,把结果放在临时表里
  • union:如果第二个select出现在union后面,则被标记为union;若union包含在form语句的子查询中,外层select将被标记为derived
  • union result:union的结果集

table:显示这一步访问的表名,有时候不是真实的表名,是第几步执行的结果

type:对表的访问方式,表示MySQL在表中找到所需行的方式,常见的访问类型有ALL、index、range、ref、eq_ref、const、system、NULL,从左到右性能从差变好

  • ALL:全表扫描,性能最差,要避免
  • index:全索引扫描,走的是二级索引叶子节点遍历
  • range:索引范围扫描
  • ref:非唯一性索引扫描,返回匹配某个值的所有行
  • eq_ref:唯一性索引扫描,返回匹配某个值的一行。常用于主键或唯一索引扫描,多表中是primary key 或unique key作为关联条件
  • const、system:MySQL对查询某部分进行优化并转换为一个常量时,使用该类型访问。比如id=100,通过索引1次就能找到。system是const类型的特例,当查询的表只有一行的情况下使用
  • NULL:MySQL在优化分解语句时,执行时甚至不用访问表或索引。比如获取索引最大最小值

possible_keys:指出MySQ能使用那个索引找到行,如果匹配到索引这里就列出

key:表示MySQL决定使用的索引,如果没有选择索引就是NULL

key_len:显示索引中使用的字节数

ref:那些列或常量被用于查找索引列上的值

rows:表示MySQL根据表统计系统和索引选用情况,估算出要扫描的行数

Extra:额外信息

  • Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,发生在对表的全部请求列都是同一个索引部分的时候,表示MySQL服务器将在存储引擎检索行后再进行过滤
  • Using temporary:表示MySQL需要使用临时表来存储结果集,常用于排序和分组
  • Using filesort:当包含‘order by‘但无法利用索引完成排序时称为文件排序,一般是因为order by后面条件导致索引失效
  • Using join buffer:表示使用了连接缓存,比如多表join的次数非常多,就将配置文件中join buffer调大一些。如果出现了这个值,应注意根据具体情况添加索引
  • Using index:只使用索引列中的信息,不需要进一步读取实际的行来获取查询列信息。比如使用了覆盖索引,查询列数小于等于索引个数且包含在索引中。
  • Using Index Condition:表示进行了ICP优化

MySQL-explain

上一篇:Q004Mysql批量修改字段注释


下一篇:MySQL5.7 重新初始化解决mysql库表坏问题