首页 > 解决方案 > 有什么方法可以加快 PostgreSQL 中的“foo%”查询?

问题描述

我有很多疑问,比如

select * from table where (upper (column1) like 'FOO%') 
                    and (upper (column2) like 'BAR%')
                    and (upper (column3) like 'XYZ%')

还有这样一个索引:

create index on table (upper(column1::text), upper(column2::text), upper(column3::text));

但是由于某种原因查询非常慢,并且解释运算符显示它不使用任何索引扫描,只是简单的秒扫描。我读过 B-tree 索引类型最适合像我这样在常量末尾带有锚点的查询。任何想法为什么会发生这种情况?我的索引创建命令可能有问题吗?

标签: sqlpostgresql

解决方案


为此,您需要三个索引:

/* "text_pattern_ops" makes the index usable for LIKE */
CREATE INDEX ON "table" (column1 text_pattern_ops);
CREATE INDEX ON "table" (column2 text_pattern_ops);
CREATE INDEX ON "table" (column3 text_pattern_ops);

PostgreSQL 将扫描一个或多个索引以寻找WHERE可以显着减少行数的条件。如果它扫描多个索引,它可以组合结果。如果这些WHERE条件之一从不具有选择性,则可以省略相应的索引,因为它不会被使用。

您将无法使用单个索引覆盖该查询。


推荐阅读