0

使用 PostgreSQL 9.6

我有一个表,其中包含一些我想过滤并按时间排序的值:

  • 时间戳(可能是在 UI 中选择的范围)
  • 状态字符串(目前只有几个已知值,也可以在 UI 中选择)
  • 上下文(UI 中数据的范围)

我想知道我是否应该:

  1. (上下文,状态)上的 btree 索引 + 时间上的单独索引
  2. 或(上下文、状态、时间)上的 btree 索引
  3. 或者每个都有一个 btree 索引?
  4. 或在(时间、状态、上下文)上的 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) 索引,但它也取决于限制。

4

1 回答 1

2

你的问题不清楚。如果您有三种潜在情况:

where timestamp between @a and @b order by time
where status = @s order by time
where context = @c order by time

然后,您需要三个索引: (timestamp, time)(status, time)(context, time)

如果条件是:

where timestamp between @a and @b and
      status = @s and
      context = @c
order by time 

然后你想要一个索引,(status, context, timestamp, time).

并且还有其他与您的描述相符的可能性。

于 2018-03-15T10:30:15.020 回答