分析SQL执行计划能精准定位性能瓶颈,通过EXPLAIN查看type、rows、Extra等关键指标,若出现ALL全表扫描、大rows数或Using filesort/Using temporary,即为优化重点。
分析SQL执行计划,就像是给数据库查询做了一次X光检查,它能清晰地揭示你的SQL语句在数据库内部到底经历了什么,走了哪条路,用了多少资源。这不是简单的"快"或"慢"的感受,而是直指核心,帮你定位到性能瓶颈的真正症结所在。通过它,我们能看到数据访问的方式、连接的策略、排序的开销,从而精准地找到优化的方向。
要深入理解SQL执行计划,我们通常会借助数据库提供的
EXPLAIN(或类似命令,如PostgreSQL的
EXPLAIN ANALYZE)工具。以MySQL为例,当你在一个
SELECT语句前加上
EXPLAIN,数据库会返回一张表格,里面包含了查询的每一步操作细节。
这张表格的关键列包括:
id: 查询的序列号,越大越先执行,相同id则从上到下执行。
select_type: 查询类型,比如
SIMPLE(简单查询)、
PRIMARY(主查询)、
SUBQUERY(子查询)等。
table: 当前操作的表名。
partitions: 查询涉及的分区。
type: 这是最重要的指标之一,表示表的连接类型或访问类型。
ALL: 全表扫描,性能最差,通常是瓶颈所在。
index: 全索引扫描,比
ALL好,但仍然扫描了整个索引。
range: 范围扫描,比如
WHERE id BETWEEN 1 AND 100,通过索引扫描一定范围的数据,效率较高。
ref: 非唯一索引扫描,使用非唯一索引或唯一索引的前缀进行查找。
eq_ref: 唯一性索引扫描,用于连接操作,对每个索引键值,只返回一条匹配行。
const/
system: 查询优化器能将查询转换为一个常量,效率最高。
possible_keys: 可能用到的索引。
key: 实际使用的索引。
key_len: 实际使用的索引长度,越短越好。
ref: 表示使用哪个列或常量和
key列进行比较。
rows: 另一个关键指标,估算的扫描行数。这个值越大,查询越慢。
filtered: MySQL 5.7+ 引入,表示通过
WHERE条件过滤后,剩余的行数占扫描行数的百分比。
Extra: 额外信息,包含了很多重要的优化提示。
Usi: 需要额外进行文件排序,通常意味着没有用到索引排序,性能较差。ng filesort
Using temporary: 需要使用临时表来处理查询,比如
GROUP BY或
DISTINCT操作,性能较差。
Using index: 表示查询是“覆盖索引”,所有需要的数据都能在索引中找到,无需回表,效率极高。
Using where: 表示使用了
WHERE子句进行条件过滤。
Using index condition: MySQL 5.6+ 引入的索引条件下推优化,在存储引擎层进行过滤,减少回表次数。
当你看到
type是
ALL,或者
rows特别大,或者
Extra中出现
Using filesort、
Using temporary时,那就是性能瓶颈的明显信号了。比如,一个查询
SELECT * FROM users WHERE age > 20 ORDER BY name;如果
age上没有索引,或者
name上没有索引且
age的