我有一张包含两个coluns的表:ID序列和' word'这是德语单词列表(按sort
命令排序,然后COPY' ied):
Aachen
Aachener
Aachenerin
Aachenerinnen
Aachenern
Aacheners
Aachens
目标是列出包含特定字符串的所有单词,f.i。:
SELECT word FROM german_words WHERE word ~ 'chen';
对于'字'列我使用了普通的唯一索引,这样的查询需要1到2秒(1.9M行)。 PostgreSQL中是否有一个索引策略可以让它更快?
答案 0 :(得分:1)
对于这种查询,以下索引是最佳的:
CREATE INDEX ON words USING gin (word gin_trgm_ops);
这需要您安装pg_trgm
extension。
来自文档:
F.31.4。索引支持
pg_trgm模块提供GiST和GIN索引运算符类,允许您在文本列上创建索引,以实现非常快速的相似性搜索。这些索引类型支持上述相似性运算符,并且还支持基于三元组的索引搜索LIKE,ILIKE,〜和〜*查询。
您可能获得的执行计划如下:
+----+---------------------------------------------------------------------------------------------------------------------------+ | | QUERY PLAN | | 1 | Bitmap Heap Scan on words (cost=20.47..70.73 rows=60 width=36) (actual time=0.147..0.432 rows=182 loops=1) | | 2 | Recheck Cond: (word ~ 'chen'::text) | | 3 | Rows Removed by Index Recheck: 2 | | 4 | Heap Blocks: exact=42 | | 5 | -> Bitmap Index Scan on words_word_idx (cost=0.00..20.45 rows=60 width=0) (actual time=0.129..0.129 rows=184 loops=1) | | 6 | Index Cond: (word ~ 'chen'::text) | | 7 | Planning time: 0.133 ms | | 8 | Execution time: 0.476 ms | +----+---------------------------------------------------------------------------------------------------------------------------+