1. 为什么我们需要EXPLAIN
第一次在慢查询日志里发现那条执行了8秒的SQL时,我盯着屏幕足足愣了一分钟。明明只是简单的三表关联查询,数据量也不过百万级别,为什么会这么慢?这就是我学习EXPLAIN的起点——一个被性能问题逼到墙角的开发者,急需找到问题根源的工具。
EXPLAIN是MySQL自带的SQL执行计划分析工具,它能告诉我们MySQL如何执行一条查询语句。就像X光片能显示骨骼结构一样,EXPLAIN能揭示SQL语句在数据库内部的执行路径。通过它我们可以知道:
- 查询使用了哪些索引(或者为什么没使用索引)
- 表的读取顺序是怎样的
- 每张表的扫描行数估计值
- 是否使用了临时表、文件排序等耗时操作
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. EXPLAIN基础使用详解
2.1 基本语法与输出解读
最基础的EXPLAIN用法就是在查询前加上EXPLAIN关键字:
sql复制EXPLAIN SELECT * FROM users WHERE age > 25;
输出结果包含若干重要列,我们需要重点关注:
| 列名 | 说明 | 典型值 |
|---|---|---|
| id | 查询标识符 | 简单查询通常为1 |
| select_type | 查询类型 | SIMPLE, PRIMARY, SUBQUERY等 |
| table | 访问的表名 | |
| type | 访问类型 | 从优到差:system > const > eq_ref > ref > range > index > ALL |
| possible_keys | 可能使用的索引 | |
| key | 实际使用的索引 | |
| key_len | 使用的索引长度 | |
| ref | 索引的哪一列被使用 | |
| rows | 预估需要检查的行数 | |
| Extra | 额外信息 | Using where, Using temporary等 |
2.2 关键指标深度解析
type列是最需要关注的性能指标之一,它显示了MySQL决定如何查找表中的行。性能从优到劣排序:
- system:表中只有一行数据
- const:通过主键或唯一索引等值查询
- eq_ref:多表关联时,关联条件使用主键或
