SQL 语句前面使用 EXPLAIN
关键字:
EXPLAIN SELECT * FROM users WHERE id = 1;
|-----------------|------------------------------------------------------------------------------------|
| 字段 | 含义 |
| id
| 查询的序号(如果是子查询或联合查询,会有多个 id
)。 |
| select_type
| 查询的类型(简单查询、子查询、联合查询等)。 |
| table
| 查询涉及的表名。 |
| partitions
| 查询时使用的分区(如果表有分区)。 |
| type
| 查询的访问类型(性能从高到低:system
> const
> eq_ref
> ref
> range
> index
> ALL
)。 |
| possible_keys
| 可能使用的索引。 |
| key
| 实际使用的索引。 |
| key_len
| 使用的索引长度。 |
| ref
| 使用的索引与哪些列或常量进行比较。 |
| rows
| 估算的扫描行数。 |
| filtered
| 计算结果集占扫描行数的百分比(MySQL 5.7+)。 |
| Extra
| 额外信息(如 Using where
、Using index
、Using temporary
等)。 |
EXPLAIN 的关键字段详解
**type:**表示 MySQL 如何访问数据,性能从高到低排序。
- system:表中只有一行数据(系统表)。
- const:通过主键或唯一索引查询,结果只有一行。
- eq_ref:在连接查询中,主键或唯一索引被使用,返回最多一行。
- ref:使用非唯一索引查询,返回匹配的多行。
- range:使用索引进行范围查询(如
BETWEEN
、IN
)。 - index:全索引扫描(比全表扫描快,但仍需遍历索引)。
- ALL:全表扫描(性能最差)。
**Extra:**提供查询的额外信息
- Using where:查询使用了
WHERE
条件。 - Using index:使用了覆盖索引(无需回表)。
- Using temporary:使用了临时表(常见于排序或分组)。
- Using filesort:使用了文件排序(性能较低)。
- Using join buffer:使用了连接缓存(多表连接时)。
如何分析 EXPLAIN 结果
通过 EXPLAIN
结果,可以优化查询:
1.检查 type:
- 目标是使用
const
、eq_ref
、ref
或range
。 - 避免
ALL
(全表扫描)。
2.检查 key:
-
- 确保查询使用了索引。
- 如果没有使用索引,考虑添加合适的索引。
3.检查 rows:
- 估算的扫描行数越少越好。
- 如果行数过多,优化查询条件或索引。
4.检查 Extra:
- 避免
Using temporary
和Using filesort
。 - 尽量使用
Using index
。
水平有限,如有错误,欢迎指正!