PostgreSQL是否可以快速搜索包含字符串数组的列?

时间:2015-06-12 20:16:01

标签: arrays database performance postgresql indexing

根据Can PostgreSQL index array columns?,PostgreSQL可以索引数组列。

它能否像对非数组类型一样有效地搜索数组列?

例如,假设您有一个问题表中的一行(如SO):

title: ...
content:...
tags: [ 'postgresql', 'indexing', 'arrays' ]

并且您想要使用标记'postgresql'查找问题。将关系存储在连接表中会更快进行搜索吗?

是的,每列都有一个索引。

1 个答案:

答案 0 :(得分:1)

GIN和GiST索引通常比简单的b树大,扫描时间更长。 GIN比GiST快,代价是非常昂贵的更新。

如果将标记存储在数组列中,则对该行的任何更新通常都需要更新数组上的索引。在某些情况下,HOT会允许跳过这个,但这不是你可以依赖的东西。所以你会有更多的索引更新和更多的索引膨胀。

另一方面,您无需扫描b树以获取所需对象的ID,然后通过连接从主表中获取它们。您还可以通过使用数组来节省相当多的空间,而不是为连接表中的每个标记支付每行28字节的开销。

如果主表上的插入和更新速率相当低 - 包括对标记的更改 - 那么GIN可能是一个合适的选择。否则,我可能会在连接表上找到一个典型的b-tree,在(tag, object_id)上有一个辅助索引,这样只能使用索引扫描来查找具有给定标记的对象。

最后,最好的办法是对其进行基准测试,以模拟您的工作量