PostgreSQL查询优化与执行计划深度解析 一、执行计划基础 1.1 EXPLAIN命令详解 PostgreSQL的EXPLAIN命令是查询优化的核心工具,它显示查询执行器的计划。 基本用法 详细分析模式 输出字段说明 Node Type:执行节点类型(Seq Scan、Index Scan、Nested Loop等) Relation Name:涉及的表名 Alias:表的别名 Startup Cost:启动成本(输出第一行前的成本) Total Cost:总成本 Plan Rows:预计返回行数 Plan Width:平均行宽度(字节) Actual Time:实际执行时间(ms) Actual Rows:实际返回行数 Actual Loops:实际执行次数
PostgreSQL的EXPLAIN命令是查询优化的核心工具,它显示查询执行器的计划。
基本用法
EXPLAIN SELECT * FROM users WHERE id = 1;
详细分析模式
-- ANALYZE:实际执行查询并获取真实执行时间 -- VERBOSE:显示详细信息 -- BUFFERS:显示缓冲区使用情况 -- FORMAT:指定输出格式(TEXT/XML/JSON/YAML) EXPLAIN (ANALYZE, VERBOSE, BUFFERS, COSTS OFF) SELECT * FROM orders WHERE user_id = 100;
输出字段说明
扫描节点(Scan Nodes)
Seq Scan(顺序扫描)
-- 小表场景 CREATE TABLE config ( key VARCHAR(50) PRIMARY KEY, value TEXT ); -- 只有几十条记录,Seq Scan是最佳选择
Index Scan(索引扫描)
-- 创建索引 CREATE INDEX idx_orders_user_id ON orders(user_id); -- 查看执行计划 EXPLAIN SELECT * FROM orders WHERE user_id = 100; -- 输出:Index Scan using idx_orders_user_id on orders
Index Only Scan(仅索引扫描)
-- 创建覆盖索引 CREATE INDEX idx_orders_cover ON orders(user_id, order_no, amount); -- 执行计划 EXPLAIN SELECT user_id, order_no, amount FROM orders WHERE user_id = 100; -- 输出:Index Only Scan using idx_orders_cover on orders
Bitmap Index Scan(位图索引扫描)
CREATE INDEX idx_orders_status ON orders(status); CREATE INDEX idx_orders_create_time ON orders(create_time); EXPLAIN SELECT * FROM orders WHERE status = 1 OR create_time > \2026-01-01'