1. 执行计划基础认知
第一次在PostgreSQL中看到执行计划时,我盯着那棵"树"看了足足十分钟——各种专业术语和箭头让我想起了大学被数据结构支配的恐惧。但当我真正理解每个符号的含义后,才发现这简直是数据库性能调优的藏宝图。
执行计划(Execution Plan)是数据库优化器生成的指令集,它用树形结构展示SQL语句的执行路径。就像你去超市购物,优化器需要决定是先买生鲜还是先拿日用品,走哪条路线最高效。PostgreSQL通过EXPLAIN命令把这个决策过程可视化,让我们能看到数据库"脑子里"在想什么。
sql复制EXPLAIN SELECT * FROM orders WHERE user_id = 100;
这条简单命令会返回类似这样的输出:
code复制 QUERY PLAN
---------------------------------------------------------
Seq Scan on orders (cost=0.00..1450.00 rows=1 width=72)
Filter: (user_id = 100)
别被这堆数字吓到,它们其实在告诉我们:数据库准备用顺序扫描(Seq Scan)的方式全表搜索orders表,预计需要检查1450个数据页才能找到user_id=100的记录。显然,这不是最优方案——我们马上会讲到如何改进。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 执行计划深度解析
2.1 核心指标解读
执行计划中的每个节点都包含几个关键指标:
- cost=0.00..1450.00:启动成本..总成本(单位是任意计算单位)
- rows=1:预计返回行数
- width=72:每行平均字节数
我第一次调优时犯的致命错误是只关注总成本。实际上启动成本同样重要,特别是对于嵌套循环连接(Nested Loop)这类操作。比如下面这个计划:
code复制Nested Loop (cost=0.15..30.23 rows=1 width=80)
-> Index Scan using users_pkey on users (cost=0.15..8.17 rows=1 width=40)
Index Cond: (id = 100)
-> Seq Scan on orders (cost=0.00..22.00 rows=10 width=40)
Filter: (user_id = 100)
这里外层循环的启动成本0.15决定了整个查询的启动延迟。如果users表很大,即使总成本不高,用户也可能感受到明显的初始响应延迟。
2.2 常见操作类型实战图谱
PostgreSQL有十几种执行操作,但掌握这几个核心类型
