MySQL EXPLAIN Notes
mysql> explain select * from t1;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | t1 | ALL | NULL | NULL | NULL | NULL | 20 | NULL |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
EXPLAIN支持 SELECT, DELETE, INSERT, REPLACE, UPDATEid查询编号,有几次 SELECT 操作就有几个编号select_type查询类型SIMPLE简单查询,查询中不包含子查询和 UNIONPRIMARY复杂查询最外层的 SELECTUNION在 UNION 中的第二个及随后的 SELECTUNION RESULT从 UNION 临时表进行的 SELECTSUBQUERY子查询中的第一个 SELECTDERIVED包含在 FROM 子句中的子查询UNCACHEABLE SUBQUERY不能被缓存的子查询,每次都要计算,是非常耗时的操作UNCACHEABLE UNIONUNION 中不能被缓存的查询
table: 当前查询访问的表名,如果有子查询或 UNION 会有以下几种格式<unionM,N><derivedN><subqueryN>
type查找访问类型,说明 MySQL 使用哪个索引在该表中找到对应的记录。按最优 - 最差依次是:systemconst表中最多有一个匹配行,速度最快eq_refprimary key 或 unique key 索引的所有部分被连接使用,最多只返回一条符合条件的记录ref不使用唯一索引,而是用普通索引,可能会找到多个符合条件的记录fulltext使用全文索引的时候才会出现ref_or_null和 ref 类似,但 MySQL 会额外一个查询来看哪些行包含了 NULLindex_merge使用了索引合并优化unique_subquery比 eq_ref 复杂的地方是使用了 IN 子查询index_subquery类似 unique_subquery 但在子查询里使用的是非唯一索引range指定范围的扫描index和 ALL 类似,不同的是只扫描索引ALL全表扫描
possible_keys可能用到了哪些索引来查找key实际扫描使用的索引key_len实际使用的索引长度ref查找时所用到的列或常量rows预估要读取的行数Extra额外补充信息- Distinct
- Using index 只使用了索引信息,没有访问行记录
- Using where 读取行记录后使用 where 判断检查
- Using temporary MySQL 创建了临时表来处理查询,需要索引优化
- Using filesort 读取结果后进行了排序操作,需要优化
Was this page helpful?