排序的字典单词列表的最佳索引

时间:2017-07-28 19:56:33

标签: postgresql

我有一张包含两个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中是否有一个索引策略可以让它更快?

1 个答案:

答案 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                                                                                                  |
+----+---------------------------------------------------------------------------------------------------------------------------+

You can check it at Rextester here