查询执行计划¶
MySQL 提供 EXPLAIN 语句来查看查询语句经过查询优化器优化后的执行计划,支持 SELECT, DELETE, INSERT, REPLACE, UPDATE 语句。
EXPLAIN¶
| 字段 | 说明 |
|---|---|
| id | 每个 SELECT 对应一个 ID,多个记录可能是同一个 ID |
| select_type | SELECT 类型 |
| table | 输出行的表 |
| partitions | 匹配的分区 |
| type | 联表类型 |
| possible_keys | 可能用到的索引 |
| key | 实际用到的索引 |
| key_len | 索引长度 |
| ref | 索引列 |
| rows | 扫描行数 |
| filtered | 过滤比例 |
SELECT 类型¶
SELECT 类型的可能值如下:
| 类型 | 说明 |
|---|---|
| SIMPLE | 简单查询,不包含 UNION 或子查询 |
| PRIMARY | 包含 UNION 或子查询的查询的第一个 SELECT |
| UNION | UNION 查询中第二个及之后的 SELECT |
| DEPENDENT UNION | UNION 查询中第二个及之后的 SELECT,依赖外部查询 |
| UNION RESULT | UNION 查询生成的临时表 |
| SUBQUERY | 子查询内的第一个 SELECT |
| DEPENDENT SUBQUERY | 子查询内的第一个 SELECT,依赖外部查询 |
| DERIVED | 派生表 |
| DEPENDENT DERIVED | 派生表,依赖外部查询 |
| MATERIALIZED | 将子查询和外部查询连接 |
SIMPLE¶
以下连接查询语句,不包含 UNION 或子查询,因此三条记录都是 SIMPLE 类型:
EXPLAIN
SELECT * FROM blog b
LEFT JOIN relation r ON b.id = r.blog_id
LEFT JOIN author a ON r.author_id = a.id;
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | b | ALL | 1 | 100.00 | ||||||
| 1 | SIMPLE | r | ref | PRIMARY | PRIMARY | 4 | study.b.id | 1 | 100.00 | Using index | |
| 1 | SIMPLE | a | eq_ref | PRIMARY | PRIMARY | 4 | study.r.author_id | 1 | 100.00 |
PRIMARY/UNION/UNION RESULT¶
以下语句使用了 UNION 关键字,其中第一个查询是 PRIMARY 类型,其余查询是 UNION 类型,最后的 UNION RESULT 表示进行去重处理生成了临时表:
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | PRIMARY | b1 | range | PRIMARY | PRIMARY | 4 | 1 | 100.00 | Using where | ||
| 2 | UNION | b2 | range | PRIMARY | PRIMARY | 4 | 1 | 100.00 | Using where | ||
| 3 | UNION RESULT | ALL | Using temporary |
如果使用 UNION ALL,则不会进行去重处理,不生成临时表:
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | PRIMARY | b1 | range | PRIMARY | PRIMARY | 4 | 1 | 100.00 | Using where | ||
| 2 | UNION | b2 | range | PRIMARY | PRIMARY | 4 | 1 | 100.00 | Using where |