PostgreSQL RUM索引介绍

pg中自带的gin索引可以用来进行全文检索之类的加速查询。
索引字段entry构造的TREE,在末端posting tree|list 里面存储的是entry对应的行号. 别无其他信息。
因此对于某些场景gin索引的性能可能会差强人意,例如我们需要检索文档中每个单词出现的次数,并按照出现次数的多少来进行排序。如果使用gin索引的话,则会从GIN中找到对应的heap tuples,然后逐一取出并计算每个匹配行的目标词个数,进行rank排序。
显然这样性能并不会太高,因为即使使用了索引仍然需要排序。那有没有什么更好的方法呢?

这种情况我们便可以使用rum索引,与GIN类似,但是在posting list|tree的每一个ctid(itempoint)后面会追加一些属性值。(例如ctid(1,10)这行包含了postgres,出现了100次,可以额外存储这个100) 。可以说rum索引的一种加强。

例子:
–建表

bill=# create table t_rum(id int,info tsvector, crt_time timestamp);
CREATE TABLE

–创建rum索引

bill=# create index idx_t_rum on t_rum using rum(info rum_tsvector_addon_ops,crt_time);
CREATE INDEX

–查询
我们对info字段进行全文检索,并且按照crt_time来排序。

bill=# explain select * from t_rum where info @@ 'postgres' order by crt_time <=>  '2019-12-16 14:55:53'; 
                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
 Index Scan using idx_t_rum on t_rum  (cost=1.30..9.22 rows=6 width=52)
   Index Cond: (info @@ '''postgres'''::tsquery)
   Order By: (crt_time <=> '2019-12-16 14:55:53'::timestamp without time zone)
(3 rows)

可以发现rum索引更加强大,因为我们不用再排序了,而且走的是index scan的方式,而gin索引则是bitmap index scan(还需要进行recheck),性能的提示可想而至。

发布了70 篇原创文章 · 获赞 5 · 访问量 3138

猜你喜欢

转载自blog.csdn.net/weixin_39540651/article/details/103770516