postgres:索引 SELECT 字符串,如 '%foo%';

Mik*_*iss 5 postgresql performance index index-tuning postgresql-performance

我有一个昂贵的定期 PostgreSQL 9.3 查询,格式如下:

SELECT * from mytable where name NOT LIKE '%foo%';
Run Code Online (Sandbox Code Playgroud)

foo这里实际上是一个永远不会改变的常数。查询开销很大,因为它需要表扫描。我希望实际上只有几行与查询匹配,所以我想使用部分索引来加快查询速度。

CREATE INDEX foo_idx ON mytable ((name NOT LIKE '%foo%')) WHERE name NOT LIKE '%foo%';
Run Code Online (Sandbox Code Playgroud)

但是,当我执行EXPLAIN查询时,它仍然使用顺序扫描而不是依赖新索引。 我究竟做错了什么?

我在CREATE INDEX语句的括号表达式子句中尝试了几种不同的表达式,但没有任何帮助:

CREATE INDEX foo_idx ON mytable (name) WHERE name NOT LIKE '%foo%';
CREATE INDEX foo_idx ON mytable ((name LIKE '%foo%')) WHERE name NOT LIKE '%foo%';
Run Code Online (Sandbox Code Playgroud)

我也尝试删除WHERE索引的子句,但这也无济于事。

Mic*_*kyT 1

您可以尝试稍微不同的方法。

CREATE INDEX foo_idx ON mytable (strpos(name,'foo'));

SELECT * from mytable where strpos(name,'foo') = 0;
Run Code Online (Sandbox Code Playgroud)

表达索引