Postgresql

對非唯一文本列進行排序時分頁

  • April 4, 2020

在非唯一文本列上對錶格進行分頁的方法是什麼?

在唯一timestamp列上,可以在其上創建索引並執行以下操作以繼續

SELECT * FROM users WHERE created > '<last element created timestamp>' ORDER BY created ASC LIMIT 20;

如果是數字主鍵

SELECT * FROM users WHERE id > 100 ORDER BY id ASC LIMIT 20;

但是,當表格按非唯一文本列(first_name例如)排序時,可以做什麼?

首先想到的是OFFSET方法,但是在大表上會有性能損失。

或者,可以使用游標,但網際網路同意它不推薦在公共Web 應用程序上使用。

一種表現良好的解決方案是智能索引。

首先,在兩列上創建一個索引,一個是您的非唯一文本列,第二個是您的 id 列(它可以是可以區分非唯一文本列行的任何列):

CREATE INDEX user_name_uuid_idx
   ON public.user USING btree
   (name COLLATE pg_catalog."default" ASC NULLS LAST, uuid ASC NULLS LAST)
   TABLESPACE pg_default;

注意:列的順序很重要。select使用查詢中使用的相同順序

然後使用此查詢獲取x頁。

SELECT * FROM user WHERE (name, uuid) > ('Misty Wyman', '070d905d-2155-492f-b811-2c9d30015299') ORDER BY name, uuid LIMIT 20; 

引用自:https://dba.stackexchange.com/questions/264287