【问题标题】:Does PostgreSQL quickly search for columns with arrays of strings?PostgreSQL 是否快速搜索带有字符串数组的列?
【发布时间】:2015-08-28 23:05:45
【问题描述】:
根据Can PostgreSQL index array columns?,PostgreSQL可以索引数组列。
它能否像搜索非数组类型一样高效地搜索数组列?
例如,假设您在问题表中有一行(如 SO):
title: ...
content:...
tags: [ 'postgresql', 'indexing', 'arrays' ]
并且您想查找带有标签'postgresql' 的问题。将关系存储在连接表中是否会更快地进行搜索?
是的,每一列都有一个索引。
【问题讨论】:
标签:
arrays
database
performance
postgresql
indexing
【解决方案1】:
GIN 和 GiST 索引通常比简单的 b-tree 更大,并且需要更长的时间来扫描。 GIN 比 GiST 更快,但代价是非常昂贵的更新。
如果您将标签存储在数组列中,则对行的任何更新通常都需要更新数组上的索引。在某些情况下,HOT 将允许跳过它,但这不是您可以依赖的。所以你会有更多的索引更新和更多的索引膨胀。
另一方面,您无需扫描 b 树以查找所需对象的 ID,然后通过连接从主表中获取它们。您还可以通过使用数组而不是为连接表中的每个标记支付每行 28 字节的开销来节省相当多的空间。
如果您在主表上的插入和更新率相当低 - 包括对标签的更改 - 那么 GIN 可能是一个合适的选择。否则,我可能会在连接表上使用典型的 b 树,在 (tag, object_id) 上有一个二级索引,以便可以使用仅索引扫描来查找具有给定标签的对象。
最后,最好的办法是对它进行基准测试以模拟您的工作负载。