将FTS应用于物化视图:查询物化视图能否复用原有全文索引?
物化视图能否复用原表全文搜索(FTS)索引问题解答
直接给结论
- 之前在原表姓名组合字段上建的FTS索引,根本没法被新建的物化视图
names直接用 - 想给这个物化视图跑高效的FTS搜索,必须给物化视图本身重建对应的FTS索引,没有能蹭源表索引的捷径
为啥索引不能直接蹭
所有数据库索引(包括FTS常用的GIN、GiST索引)都是和具体所属的表强绑定的:索引本身是依附于特定表的物理存储做的特殊结构,既不会跨对象继承,也不会跟着数据拷贝自动迁移。
你写CREATE MATERIALIZED VIEW names AS SELECT * FROM table建出来的物化视图,本质是一个有自己独立物理磁盘存储的正经数据库表:哪怕它刚建的时候把源表的数据原封不动抄了一遍,它和原来带FTS索引的源表也是两个完全独立的实体。查物化视图的时候数据库直接读物化视图自己存的数据,根本不会回头去碰源表,自然也就用不上源表上建的那个FTS索引。
这里要和普通视图划清界限:普通视图自己不存数据,查的时候数据库会把视图的查询逻辑直接下推到底层源表,这时候确实能命中源表的索引;但物化视图是提前把查询结果算好存在自己的存储里的,执行逻辑和普通视图完全不是一回事。
几个容易踩的坑
- 哪怕你建物化视图的时候,把源表上用来做FTS搜索的tsvector计算列也通过
SELECT *一起带过去了,索引也不会跟着数据一起复制到物化视图上:物化视图只是存了这个列的数值,没有对应的索引结构,数据量稍大的时候做FTS搜索就会走全表扫描,性能掉得非常明显。 - 给物化视图建完FTS索引之后,不用每次刷新物化视图都重新建索引:PostgreSQL做物化视图全量刷新的时候,会自动维护物化视图上已经存在的索引,只要索引是建在物化视图本体上的,刷新完照样能用。
内容的提问来源于stack exchange,提问作者samuelbrody1249
相关产品推荐
相关产品推荐

