在大型表中使用 OFFSET 最佳化慢速 PostgreSQL 查詢 在針對大型 PostgreSQL 表的查詢中使用 OFFSET 通常會導致效能瓶頸。本文解決了這個問題,重點介紹 PostgreSQL 9.5 及更高版本的最佳化策略。 挑戰: 想像一個巨大的表,big_table,包含大量記錄。 您需要使用 ORDER BY 和 OFFSET 來擷取分頁資料。即使使用適當的索引(例如 vote_order_asc 和 vote_order_desc),當 OFFSET 值較大時,效能也會顯著下降。 解:鍵集分頁 PostgreSQL 無法直接跳過具有大 OFFSET 值的行,因此需要在達到目標偏移量之前對所有行進行排序和計數。 為了克服這個問題,請使用使用行值比較的鍵集分頁: SELECT * FROM big_table WHERE (vote, id) > (vote_x, id_x) ORDER BY vote, id LIMIT n; 此方法需要 (vote, id) 的獨特組合才能得到一致的結果。 vote_order_asc 索引在這裡證明是有用的。 關鍵對齊: 保持 ORDER BY 方向和 WHERE 子句中的比較運算子之間的一致性。 例如,如果 WHERE 使用 >,那麼 ORDER BY 應該使用 ASC。 進一步考慮: 雖然這種鍵集分頁方法提供了顯著的效能改進,但必須承認其限制: 假設(vote, id) 是唯一的。 表的同時更新可能需要進一步分析以選擇最佳策略。 對於頻繁並發修改的複雜場景,更詳細的調查對於確定最有效的最佳化方法至關重要。