【发布时间】:2015-01-24 23:25:21
【问题描述】:
假设我们有下表:
我有以下对象:
struct Tick = {
country string
region string
type string
spec map string -> int # {v1: n1, v2:n2}
t timestamp
}
我想将这些对象存储在 Posgresql 9.4 中。将有数百万。 90% 的查询将涉及:
type-
country/region的组合(两者,一个或无) -
t范围(大部分将只是t > tx)
以上所有查询组合都是均匀分布的。 然后大约 5% 将额外涉及检查规范属性:存在或范围。
在 Postgresql 9.4 中对此类对象进行编码的最佳方法是什么?应该创建哪个索引?
几个想法:
- 将所有字段编码为单个字符串并进行正则表达式查询。例如:
encoded = "type;country;v1:n1;v2:n2"。那么,是否可以创建一个复合索引(t, encoded),这将允许对t的范围查询和对encoded的正则表达式查询?在这种方法中,我们忽略了索引中的规范范围检查, - 对
jsonb中的所有内容进行编码。那么,是否可以对一些jsonb属性进行索引范围查询呢?
[编辑]
广告。 1. 无需将这些值编码为单个字符串,而是将它们放在一个表中 (tab = {type, country, v1+n1, ...}) 并使用 btree_gini 扩展创建 gin 索引:gin (t timestamp_ops, tab _text_ops)。
【问题讨论】:
-
什么禁止你使用一个包含 5 个字段和经典索引的简单 Tick 表?
-
在“经典”索引中:
(a,b,c,d)如果不同时指定a和b,我将无法查询c。
标签: sql postgresql indexing