阅读 EXPLAIN 与 EXPLAIN ANALYZE
阅读计划树,理解成本与实际耗时的差异,并找出开销最大的节点
阅读 EXPLAIN 与 EXPLAIN ANALYZE 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
为什么使用 EXPLAIN?
EXPLAIN 会显示规划器执行查询的策略,但不会运行查询。EXPLAIN ANALYZE 会运行查询,并显示实际耗时。
基本 EXPLAIN
显示估算的执行计划:
EXPLAIN SELECT * FROM orders WHERE user_id = 42;
-- QUERY PLAN
-- ---------------------------------------------------------------
-- Index Scan using orders_user_id_idx on orders
-- (cost=0.43..8.45 rows=5 width=120)
-- Index Cond: (user_id = 42)EXPLAIN ANALYZE
运行查询,并添加实际耗时和行数:
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 42;
-- Index Scan using orders_user_id_idx on orders
-- (cost=0.43..8.45 rows=5 width=120)
-- (actual time=0.041..0.043 rows=4 loops=1)
-- Planning Time: 0.082 ms
-- Execution Time: 0.057 ms读取执行计划树
执行计划是树状结构。缩进表示子节点。子节点会先于父节点运行。
Aggregate
-> Hash Join
Hash Cond: (o.user_id = u.id)
-> Seq Scan on orders
-> Hash
-> Seq Scan on users成本与耗时
cost 列包含 TWO 个数字:startup_cost..total_cost。这些是规划器使用的任意单位,并不是秒数。请使用 actual time 获取真实数值。
rows = 估算值;actual rows = 实际值
rows 是规划器的估计值。actual rows 是实际发生的结果。如果两者相差很大,说明统计信息不准确。
循环会放大时间
对于嵌套循环,actual time=X loops=N 表示每次迭代耗时 X;每个节点的总耗时为 X×N。
Nested Loop (actual time=0.05..2.03 rows=500)
-> Seq Scan on orders (actual ... loops=1)
-> Index Scan using users_pkey (actual time=0.01..0.01 loops=500)BUFFERS 告诉您输入/输出情况
EXPLAIN (ANALYZE, BUFFERS) 会报告缓冲区命中和读取情况,也就是这些耗时背后的输入/输出:
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
-- Buffers: shared hit=12 read=4FORMAT 选项
如果要进行程序化处理,请使用 JavaScript 对象表示法或 YAML:
EXPLAIN (ANALYZE, FORMAT JSON) SELECT ...;不要对具有破坏性的语句执行 EXPLAIN ANALYZE!
对 UPDATE/DELETE/INSERT 执行 EXPLAIN ANALYZE 会实际执行这些语句。如果您想检查语句但不提交,请将其放在事务中,并使用 ROLLBACK:
BEGIN;
EXPLAIN ANALYZE DELETE FROM orders WHERE ...;
ROLLBACK;常见的计划节点
- 顺序扫描 — 读取整个表
- 索引扫描 — 使用索引
- 位图堆扫描 — 组合多个索引
- 哈希连接 / 合并连接 / 嵌套循环 — 连接策略
- 排序、聚合、限制、物化
阅读计划的工作流程
- 对运行缓慢的查询执行 EXPLAIN ANALYZE
- 找到
actual time最高的节点 - 比较估算的
rows与actual rows - 检查是否正在使用索引
- 反复调整:添加索引 / 重写 / ANALYZE
回顾
EXPLAIN ANALYZE 是您主要的性能工具。
- 成本是相对值,时间是真实值
- 估算行数与实际行数的差异可以揭示统计信息问题
- BUFFERS 显示输入/输出情况
- 将具有破坏性的查询放在 BEGIN; ... ROLLBACK 中
快速检查
EXPLAIN 和 EXPLAIN ANALYZE 有什么区别?
常见问题解答
「阅读 EXPLAIN 与 EXPLAIN ANALYZE」课时是免费的吗?
是的 — 「阅读 EXPLAIN 与 EXPLAIN ANALYZE」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「阅读 EXPLAIN 与 EXPLAIN ANALYZE」这节课中我会学到什么?
阅读计划树,理解成本与实际耗时的差异,并找出开销最大的节点 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「阅读 EXPLAIN 与 EXPLAIN ANALYZE」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 阅读 EXPLAIN 与 EXPLAIN ANALYZE
- 顺序扫描与索引扫描
- 哈希连接、合并连接与嵌套循环
- 识别并修复慢查询