最佳化 PostgreSQL 中的分頁:克服 OFFSET 效能問題的策略
將 OFFSET
與大型 PostgreSQL 表一起使用通常會導致效能問題。 以下是提高分頁效率的有效策略:
鍵集分頁:利用行值比較
不要依賴 OFFSET
,而是利用行值比較來更有效地跳過行。這涉及按相關列對錶進行排序,並使用上一頁的最後一行的值作為下一頁查詢的起點。
<code class="language-sql">SELECT * FROM big_table WHERE (vote, id) > (vote_x, id_x) -- Row value comparison ORDER BY vote, id LIMIT n;</code>
此方法有效地使用 (vote, id)
上的索引來過濾結果。
索引行號方法(讀取繁重的工作負載)
對於主要用於讀取的表,添加索引行號列提供了一種直接跳過行的方法,從而消除了 OFFSET
的需要。 注意:這對於頻繁更新的表來說並不理想。
<code class="language-sql">ALTER TABLE big_table ADD COLUMN row_number INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY; SELECT * FROM big_table WHERE row_number > x LIMIT n;</code>
重要注意事項:
ORDER BY
子句與分頁方向對齊。 NULL
約束或 NOT NULL
處理 NULLS FIRST/LAST
值以避免意外行為。 以上是如何優化 PostgreSQL 中大型表的分頁以避免 OFFSET 瓶頸?的詳細內容。更多資訊請關注PHP中文網其他相關文章!