learning_notes

学习笔记

View project on GitHub

执行计划

MySQL 性能优化神器 Explain 使用分析

//输出格式
mysql> explain select * from user_info where id = 2\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user_info
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

各列的含义如下:

id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.

select_type: SELECT 查询的类型.

table: 查询的是哪个表

partitions: 匹配的分区

type: join 类型

possible_keys: 此次查询中可能选用的索引

key: 此次查询中确切使用到的索引.

ref: 哪个字段或常数与 key 一起被使用

rows: 显示此查询一共扫描了多少行. 这个是一个估计值.

filtered: 表示此查询条件所过滤的数据的百分比

extra: 额外的信息

select_type
  • SIMPLE, 表示此查询不包含 UNION 查询或子查询
  • PRIMARY, 表示此查询是最外层的查询
  • UNION, 表示此查询是 UNION 的第二或随后的查询
  • DEPENDENT UNION, UNION 中的第二个或后面的查询语句, 取决于外面的查询
  • UNION RESULT, UNION 的结果
  • SUBQUERY, 子查询中的第一个 SELECT
  • DEPENDENT SUBQUERY: 子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果.
type

性能关系: ALL < index < range ~ index_merge < ref < eq_ref < const < system

  • system : 表中只有一条数据. 这个类型是特殊的 const 类型
  • const : 针对主键或唯一索引的等值查询扫描
  • eq_ref : join 查询 前表”=”后表
  • ref: join 查询, 针对于非唯一或非主键索引
  • range: 表示使用索引范围查询 > < between
  • index: 全索引扫描
  • ALL: 全表扫描 最差
possible_keys

可能使用的索引,真正使用的是key里面的

key_len

使用索引的字节数,评估组合索引是否完全使用

rows

查询的行数,不准确,可配合 show status like "%innodb_rows%";查看

Extra
  • using index:出现这个说明mysql使用了覆盖索引,避免回表
  • using where:表示Mysql将对storage engine提取的结果进行过滤,过滤条件字段无索引
  • using temporary:这意味着mysql对查询结果进行排序的时候使用了一张临时表。
  • using filesort:这个说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。
  • using join buffer (Block Nested Loop), using join buffer (Batched Key Access): 使用BNL或者BKA算法对join优化
  • Using index for group-by: 分组字段使用索引