多列上的 PostgreSQL 索引,什么时候太多了?

PostgreSQL index on multiple columns, when is it too much?

使用 PostgreSQL 9.6

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

我想知道我是否应该:

  1. (上下文,状态)上的 btree 索引 + 时间上的单独索引
  2. 或关于(上下文、状态、时间)的 btree 索引
  3. 或每个上的 btree 索引?
  4. OR (time, status, context) 的 btree 索引,用于小的时间范围?

我怀疑数字 1 是最佳选择,context + status 将允许过滤掉值,然后它将扫描时间索引。 我在我的数据上同时创建了 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) 索引,但这也取决于限制。

你的问题不清楚。如果你具备三种潜在条件:

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)

还有其他符合你描述的可能性。