← 回筆記簿 春春的技術筆記
軟體

Postgres 慢查詢:從 EXPLAIN ANALYZE 開始讀

一支拖垮服務的查詢,如何用執行計畫找到該補的索引。

難度
●●○ 中階
需要的工具
PostgreSQLpsql

某天 API 突然變慢,APM 指到一支訂單查詢。與其猜,不如直接讓 Postgres 告訴你它打算怎麼跑。

EXPLAIN ANALYZE
SELECT * FROM orders
WHERE user_id = 42
AND created_at > now() - interval '30 days';

輸出最上面看到 Seq Scan on orders,代表它把整張表掃了一遍。對一張幾百萬列的表,這就是慢的原因。

  1. 針對 WHERE 用到的欄位建立複合索引,讓查詢能走 Index Scan。
CREATE INDEX idx_orders_user_created
ON orders (user_id, created_at);

注意: 複合索引的欄位順序有講究——等值條件放前面、範圍條件放後面,這支查詢才吃得到索引。

重跑一次 EXPLAIN ANALYZE,執行時間從 1.8 秒掉到 4 毫秒。重點不是背規則,而是養成先看執行計畫的習慣。

#db#postgres#performance
春春
白天寫服務端、晚上拆硬體。這個筆記簿記錄那些查了三小時才搞懂、不想再忘記的事。