軟體
Postgres 慢查詢:從 EXPLAIN ANALYZE 開始讀
一支拖垮服務的查詢,如何用執行計畫找到該補的索引。
某天 API 突然變慢,APM 指到一支訂單查詢。與其猜,不如直接讓 Postgres 告訴你它打算怎麼跑。
EXPLAIN ANALYZESELECT * FROM ordersWHERE user_id = 42 AND created_at > now() - interval '30 days';輸出最上面看到 Seq Scan on orders,代表它把整張表掃了一遍。對一張幾百萬列的表,這就是慢的原因。
- 針對
WHERE用到的欄位建立複合索引,讓查詢能走 Index Scan。
CREATE INDEX idx_orders_user_created ON orders (user_id, created_at);注意: 複合索引的欄位順序有講究——等值條件放前面、範圍條件放後面,這支查詢才吃得到索引。
重跑一次 EXPLAIN ANALYZE,執行時間從 1.8 秒掉到 4 毫秒。重點不是背規則,而是養成先看執行計畫的習慣。
春
春春
白天寫服務端、晚上拆硬體。這個筆記簿記錄那些查了三小時才搞懂、不想再忘記的事。