我正在使用 Postgres 9.5。我想创建索引来进行查询
select * FROM my_object_times where name like ‘Dave %’;
和
select * FROM my_object_times where name like '% LastName';
奔驰。所以我创造了……
CREATE INDEX my_object_times_name_idx ON my_object_times (name text_pattern_ops);
CREATE INDEX my_object_times_rev_name_idx ON my_object_times (reverse(name) text_pattern_ops);
这在第一种情况下工作正常,我可以看到我的索引被使用,但在第二种情况下,“Explain”没有显示我的索引被使用......
my_db=> explain select * FROM my_object_times where name like '% LastName';
QUERY PLAN
------------------------------------------------------------------
Seq Scan on my_object_times (cost=0.00..136594.69 rows=51 width=221)
Filter: ((name)::text ~~ '% LastName'::text)
在第二种情况下如何使用我的索引?
回答,因为您没有在查询中反转它,这不是隐含的。
然而,这是一个可怕的想法。而是删除这两个索引。如果您必须对“LastName”之类的内容进行非锚定匹配,请尝试pgtrgm 扩展名,它只适用于
LIKE
和%
. 告诉我们进展如何。安装 pg_trgm,
创建 gist 或 gin 索引。
有关详细信息,请参阅depesz 上的这篇博客文章。
为什么两个
text_pattern_ops
是一个次等的想法,text_pattern_ops
永远不支持'%foo%'
reverse()
的所有条件。{LastName: { $like: '% LastName' } }
这不太可能产生,reverse(LastName) LIKE reverse('% LastName')
. 因此,除非您全部手动编写索引,否则根本不会使用该索引:充其量,这会混淆您对第三方工具的使用,在最坏的情况下,它不可能或很难工作。该选项在哪里pg_trgm
起作用。另外,作为另一个注意事项,如果它只是缩小到大小,你总是可以得到另一个硬盘驱动器,将它设置为一个
TABLESPACE
并将 GIST 索引存储在那里。这并不能解决 /space/ 问题,但应该可以缓解它。