多列上的 PostgreSQL 索引,什么时候太多了?
PostgreSQL index on multiple columns, when is it too much?
使用 PostgreSQL 9.6
我有一个 table,其中包含一些我想过滤并按时间排序的值:
- 一个时间戳(可以是在UI中选择的范围)
- status string(目前只有几个已知值,UI中也选择了table)
- 上下文(UI中的数据范围)
我想知道我是否应该:
- (上下文,状态)上的 btree 索引 + 时间上的单独索引
- 或关于(上下文、状态、时间)的 btree 索引
- 或每个上的 btree 索引?
- 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)
。
还有其他符合你描述的可能性。
使用 PostgreSQL 9.6
我有一个 table,其中包含一些我想过滤并按时间排序的值:
- 一个时间戳(可以是在UI中选择的范围)
- status string(目前只有几个已知值,UI中也选择了table)
- 上下文(UI中的数据范围)
我想知道我是否应该:
- (上下文,状态)上的 btree 索引 + 时间上的单独索引
- 或关于(上下文、状态、时间)的 btree 索引
- 或每个上的 btree 索引?
- 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)
。
还有其他符合你描述的可能性。