1.what is explain(explain 是个什么东东)
explain(解释),在 Mysql 中 作为一个关键词,用来解释 Mysql 是如何执行语句,可以连接 select 、delete、insert、update 语句。
通常我们使用 explain 连接 一条 select 语句,查看运行状态,判断是否需要优化。
2.how to use explain(如何使用呢)
栗子:
explain select s.name,s.id,s.age,s.create_time from student s;
输出:
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | SIMPLE | s | NULL | ALL | NULL | NULL | NULL | NULL | 7 | 100.00 | NULL | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ 1 row in set, 1 warning (0.00 sec)
官方:
EXPLAIN [explain_type] explainable_stmt explain_type: { EXTENDED | PARTITIONS | FORMAT = format_name } explainable_stmt: { SELECT statement | DELETE statement | INSERT statement | REPLACE statement | UPDATE statement }
输出的列名:
- id : select 标识符
- select_type:select 类型
select_type 可选值 |
含义 |
---|---|
SIMPLE |
简单的 select,没有使用 UNION 或者 子查询 |
PRIMARY |
最外一层的 select |
UNION |
UNION 中第二个或者后面的 select 语句 |
DEPENDENT UNION |
UNION 中第二个或者后面的 select 语句,依赖于外层的 select |
UNION RESULT |
UNION 的结果 |
SUBQUERY |
子查询的第一个 select |
DEPENDENT SUBQUERY |
子查询的第一个 select,取决于外层的 select |
DERIVED |
派生表 |
MATERIALIZED |
Materialized subquery |
UNCACHEABLE SUBQUERY |
无法缓存结果的子查询,必须为外部查询的每一行重新计算其结果 |
UNCACHEABLE UNION |
UNION 查询中不可缓存的子查询中的第二个或者后一个 select |
- table:输出行对应的表
- partitions:匹配的分区
- type:join 类型
- possible_keys:可选的索引
- key:实际选择的索引
- key_len:实际使用索引的长度
- ref:与索引比较的列
- rows:扫描行数的预估值
- filtered:按表条件筛选的行的百分比
- Extra:额外信息
3.重点关注的列
type 列
type 列描述了表的 join 类型,以下以 查询的最优到最差的排序列出了可能值:
- system :当表只有一条数据(= system table)时,为 system 类型,是 const 类型的 特例。
- const:当表最多只有一条数据相匹配时,为 const 类型。因为只有一行,所以优化器的其余部分可以将此行列中的值视为常量(constant)。const表非常快,因为它们只读一次。在使用 主键 或者 唯一索引 和常量比较时,即为 const 类型。
栗子:
explain select s.* from student s where s.id = 1
输出:
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ | 1 | SIMPLE | s | NULL | const | PRIMARY | PRIMARY | 8 | const | 1 | 100.00 | NULL | +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
- eq_ref:通常出现在多表 join 查询,并且 关联的字段是 主键 或者 唯一非空索引,即后表 只能匹配一条数据。
- ref:通常出现在多表 join 查询,关联使用了 最左前缀 或者 关联的是非主键 或者 非 唯一索引(也就是说,join 不能根据索引选择 单行数据)
- fulltext:使用全文索引执行 join
- ref_or_null:在 ref 的基础上 , 另外还搜索了包含空值的行
- index_merge:
- unique_subquery
- index_subquery
- range:
- index:和 all 类似 ,只不过 扫描的是 索引树
- all:全表扫描,效率最差,避免出现