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优化