簡體   English   中英

Postgres:在該文本上創建索引是否為空

[英]Postgres: Create index on that text is null or not

假設我們有一張桌子:

CREATE TABLE public."Comments"
(
    id integer NOT NULL DEFAULT nextval('"Comments_id_seq"'::regclass),
    comment text COLLATE pg_catalog."default",
    CONSTRAINT "Comments_pkey" PRIMARY KEY (id)
)

我們需要快速選擇comment IS NULLcomment IS NOT NULL ,但是我們不需要全文搜索。

是否可以通過某種方式為此創建索引,而不創建全文索引?

索引僅在WHERE條件為選擇性的情況下才有幫助,也就是說,它會過濾掉很大一部分行。 確實,如果條件不是選擇性的,PostgreSQL將更喜歡高效的順序掃描。

因此,您不能擁有一個對這兩種情況都有幫助的索引,但是您可以擁有一個對這兩種情況較少發生的幫助的索引。

如果注釋通常為NULL,則可以使用:

CREATE INDEX ON "Comments" (id) WHERE comment IS NOT NULL;

除了Laurenz的答案之外,如果您沒有那么多的注釋為null的情況,則可以使用btree索引,因為它們可用於查找:

create index comments_comment_idx ON "Comments" (comment);

只要注釋足夠短而不會被烘烤,您就可以搜索它們是否相等。 您也可以搜索范圍和前綴。 但是,如果它們持續幾kb,您可能會開始遇到問題,因此,僅在預計注釋會相當短的情況下才建議使用此方法。

進一步說明,還有其他優化此類查詢的方法。 進一步說明,如果您要通過id進行大量排序,則可能需要創建多列索引,該索引將允許僅索引掃描:

create index comments_comment_id_idx ON "Comments" (id, comment);

如果您想要最后五個ID(例如,comment不為null),這將很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM