繁体   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