MySql优化——Explain详解
查询语句执行顺序标识:分区信息(常用于分库分表场景):预估关联表连接行数(计算公式:rows × filtered/100)
·
Explain命令详解
基本字段说明
-
id:查询语句执行顺序标识
- id值越大,执行优先级越高
- id值越小,执行优先级越低
- id相同时,按行内顺序执行
-
partition:分区信息(常用于分库分表场景)
-
filtered:预估关联表连接行数(计算公式:rows × filtered/100)
select_type字段(SQL执行类型)
| 类型 | 说明 |
|---|---|
| SIMPLE | 简单查询(无关联、子查询) |
| PRIMARY | 复杂查询中最外层的select |
| SUBQUERY | 包含在select中的子查询(不在from子句中) |
| DERIVED | 衍生查询/衍生表(from子句生成的临时表) |
区别说明:
- SUBQUERY:select子句生成的查询表
- DERIVED:from子句生成的临时表
type字段(查询范围)
按性能优劣排序(从优到差): system > const > eq_ref > ref > range > index > ALL
各类型说明:
| 类型 | 说明 |
|---|---|
| Null | 优化阶段即可获取结果(如SELECT MIN(id) FROM table) |
| system | const特例,表结果集仅一条记录 |
| const | 使用主键/唯一索引查询单条记录(效率极高) |
| eq_ref | 关联查询使用主键/唯一键 |
| ref | 使用普通索引/唯一索引部分前缀 |
| range | 索引范围查找 |
| index | 扫描全索引获取结果(通常扫描二级索引) |
| ALL | 全表扫描(聚簇索引顺序扫描) |
性能建议:
- 至少达到range级别
- 最好达到ref级别
- 避免ALL全表扫描
其他重要字段
- possible_key:可能用到的索引
- key:实际使用的索引
- key_len:使用的联合索引字段长度
- ref:索引关联查询条件
- rows:预估扫描行数(非实际结果行数)
Extra字段(额外信息)
| 信息 | 说明 |
|---|---|
| Using Index | 覆盖索引,无需回表 |
| Using Where | 使用where条件处理结果(未走索引) |
| Using index condition | 查询列未完全覆盖索引,where条件使用前导列范围查询 |
| Using temporary | 使用临时表 |
| Using filesort | 使用文件排序 |
补充命令
在explain语句后添加SHOW WARNINGS可以查看MySQL优化后的语句(注意:优化后的语句不一定可直接执行)。
更多推荐

所有评论(0)