假设我们有一张表:
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 NULL
或comment IS NOT NULL
所在的行,但我们不需要全文搜索。
是否有可能为此创建索引,但不能创建全文索引?
答案 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,那将非常有用。