数据库慢查询定位:从慢日志到 EXPLAIN ANALYZE——PostgreSQL 篇
引言 "PG 有条 SQL 特别慢,但我说不清慢在哪。"这个求助背后通常藏着三个没做对的事:不知道哪条 SQL 最该被优化(凭感觉抓一条,可能优化完也省不出 1% 的负载)、不知道它为什么慢(猜是缺索引,加完索引发现没走)、不知道优化后有没有变好(没有前后数据,全靠"感觉快了")。MySQL 时代大家习惯了 slow log + EXPLAIN 那套流程,但 PG 的参数名、日志格式、EXPLAIN 输出都长着另一副面孔,照搬经验会处处碰壁。 PG 的慢查询定位有一套清晰的漏斗:慢查询日志圈定"慢"的事实 → pg_stat_statements 排序找出"最值得治"的 SQL → EXPLAIN ANALYZE 拆开看它到底慢在哪一步。这三步各解决一个层次的问题,跳过任何一步都容易变成"在错误的 SQL 上使劲"。这篇文章按漏斗顺序走完整个流程,并把重心放在第三步——读懂 PG 的 EXPLAIN 输出:Seq Scan / Index Scan / Bitmap Scan 三种扫描节点的区别与选择逻辑、cost 的真实含义(它不是时间)、以及 rows 估算与实际行数偏差为什么是"....