使用 PostgreSQL 9.6
我有一个表,其中包含一些我想过滤并按时间排序的值:
- 时间戳(可能是在 UI 中选择的范围)
- 状态字符串(目前只有几个已知值,也可以在 UI 中选择)
- 上下文(UI 中数据的范围)
我想知道我是否应该:
- (上下文,状态)上的 btree 索引 + 时间上的单独索引
- 或(上下文、状态、时间)上的 btree 索引
- 或者每个都有一个 btree 索引?
- 或在(时间、状态、上下文)上的 btree 索引,用于小时间范围?
我怀疑数字 1 是最好的选择,上下文 + 状态将允许过滤掉值,然后它会扫描时间索引。我在我的数据上同时创建了 1 号并看到了一些改进,但是您如何在每种方法之间做出决定,是否有一些指导方针?
其中一个查询或多或少类似于:
select * from event
where severity = 'WARNING' and
fk_context = 1359544
order by timestamp LIMIT 30; // Other one has timestamp > ...
另一个正在寻找时间范围。我看起来 postgres 使用多个索引,一个使用 (fk_context, severity, timestamp) 然后使用 (severity, time) 索引,但它也取决于限制。