使用Postgres 9.5和我尝试使用包含URL的列上的LIKE运算符来提高搜索性能。
考虑一个这样的表,大约有5000万行
CREATE TABLE page_hit (
timestamp_ timestamp without time zone NOT NULL,
location_url character varying(2048)
)
和像这样的查询
SELECT count(*)
FROM page_hit
WHERE location_url LIKE 'http://mysite.foo.com/path/morepath%'
以上查询使用以下索引
CREATE INDEX location_idx
ON page_hit
USING btree
(location_url varchar_pattern_ops);
作品很棒..但是......在字符串的其他部分支持LIKE外卡(例如前导%)我创建了一个GIN索引,如下所示
CREATE INDEX location_idx_gin
ON page_hit
USING gin
(location COLLATE pg_catalog."default" gin_trgm_ops);
问题是当我在上面的查询上运行EXPLAIN ANALYZE时,它现在只使用location_idx_gin并忽略location_idx,这有点糟糕导致location_idx索引在追踪%查询时更快。查询计划程序似乎在所有情况下都忽略了我的BTREE索引并使用了GIN索引。
BTREE指数优于GIN指数(在尾随%的情况下)但我希望计划者仅在领先%的情况下选择GIN指数。有没有办法做到这一点?
某些指标(查询尾随%):