Postgresql
對非唯一文本列進行排序時分頁
在非唯一文本列上對錶格進行分頁的方法是什麼?
在唯一
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;