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'