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