1、基本语法
EXPLAIN的使用与DESCRIBE基本相同
sql
EXPLAIN SELECT select_options
或者
DESCRIBE SELECT select_options
2、EXPLAIN各列作用
2.1、table:表名
查询的每一行记录都对应一个单表,其中也分为驱动表和被驱动表
例如:
其中,s1是驱动表,s2是被驱动表
sql
EXPLAIN SELECT * FROM S1 INNER JOIN S2
2.2、id:每个SELECT关键字对应唯一一个id
- id如果相同,即是一组,且从上往下执行
- id越大,优先级越高,越先执行
- id的每个号码,表示一趟独立的查询,一个sql查询趟数越少越好
2.3、select_type:SELECT关键字对应的查询类型
关键字 | 类型 |
---|---|
SIMPLE | 其他 |
PRIMARY | UNION或者子查询最左边的小查询 |
UNION | UNION或者子查询除了最左边的小查询 |
UNION RESULT | UNION查询去重工作产生的临时表 |
SUBQUERY | 不相关子查询 |
DEPENDENT SUBQUERY | 相关子查询 |
DEPENDENT UNION | 相关子查询中带有UNION |
DERIVED | 派生表的查询 |
2.4、type(重要)
执行计划的一条记录表示MySQL对某个表的执行查询时的访问方法。type列明确了这个访问方法。
访问方法 | 解释 |
---|---|
system | 表中只有一条记录,且该表的存储引擎统计数据是精确的,如MyISAM、Memory |
const | 根据主键或者唯一二级索引列与常数进行等值匹配 |
eq_ref | 被驱动表根据主键或者唯一二级索引列与常数进行等值匹配 |
ref | 普通二级索引列与常数进行等值匹配 |
ref_or_null | 普通二级索引列与常数进行等值匹配或为null时 |
unique_subquery | 如果查询优化器将IN子查询转化为EXISTS子查询且使用到主键进行等值匹配 |
range | 使用索引获取某些范围区间的记录 |
index | 使用索引覆盖,但需要扫描全部的索引记录时 |
all | 全表扫描 |
由快到慢依次为*system > *const > *eq_ref > *ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > *range > *index > *ALL
2.5、possible_keys和key
可能用到的索引和实际上使用的索引
2.6、key_len(重要)
该属性表示实际用到的索引长度,可以帮助来检查是否充分的用上了索引。
相关计算:
- varchar(10)变长字段且允许NULL = 10 * (utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)
- varchar(10)变长字段且不允许NULL = 10 * (utf8=3,gbk=2,latin1=1)+2(变长字段)
- varchar(10)固定字段且允许NULL = 10 * (utf8=3,gbk=2,latin1=1)+1(NULL)
- varchar(10)固定字段且不允许NULL = 10 * (utf8=3,gbk=2,latin1=1)
2.7、ref
等值查询时,与索引列进行等值匹配的对象信息。
2.8、rows
预估要读取的条目数,越小越好
2.9、filtered
某表经过搜索条件过滤后剩余的记录条数的百分比
2.10、extra(重要)
会根据产生的错误进行相关提示
索引条件下推(以后补)