Postgres:在该文本上创建索引为空或不

时间:2017-09-20 08:10:48

标签: sql postgresql

假设我们有一张表:

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所在的行,但我们不需要全文搜索。

是否有可能为此创建索引,但不能创建全文索引?

2 个答案:

答案 0 :(得分:1)

索引只会在WHERE条件具有选择性时帮助您,也就是说,它会过滤掉相当大比例的行。实际上,如果条件不具有选择性,PostgreSQL将更喜欢更有效的顺序扫描。

所以你不能有一个有助于这两种情况的索引,但你可以有一个索引,可以帮助减少这些情况的频率。

如果评论通常为NULL,您可以使用:

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

答案 1 :(得分:1)

除了Laurenz的回答之外,如果你没有那么多注释为null的情况,你可以使用btree索引,因为它们可以用来查看它:

create index comments_comment_idx ON "Comments" (comment);

这使您能够搜索评论的相等性,只要它们足够短,不会被烘烤。您还可以搜索范围和前缀。但是,如果他们继续使用几kb,你可能会遇到问题,所以建议只有在评论预期相当短的情况下才使用这种方法。

进一步说明,还有其他方法可以优化此类查询。另外请注意,如果您按ID进行大量排序,则可能需要执行允许仅索引扫描的多列索引:

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

如果您想要评论不为空的最后五个ID,那将非常有用。