【发布时间】:2021-05-04 04:52:27
【问题描述】:
我有一个 PostgreSQL 数据库和一个包含事件的表。这些事件有列 end_time,它有一个类型的时间戳(没有时区信息)。在我的应用程序中,我经常查询表,试图选择未来发生的所有事件。所以基本上我在做这种 SQL 查询:
SELECT * FROM events WHERE end_time >= ?::timestamp
我目前在 end_time 列上没有索引。我担心一旦我的表行大小变大(实际上它已经做了很多),未来事件的搜索查询会变慢吗?因为现在数据库搜索必须遍历所有行以选择将来发生(或更准确地说,结束)的行。我以前使用过索引,但不能说我最熟悉它们。我想知道通过创建默认的 Postgres 索引来索引 end_time 列是否会提高查询的性能?我还没有真正的问题,但我不想等待它在数据量增加时出现。因为那时有点晚了,至少最终应用的用户体验已经下降了。
我想指出我确实使用了没有时区的时间戳,因为我的应用程序始终假定为当地时间,我不需要时区信息。但我听说它可能对索引有影响?此外,我的时间戳目前不受任何限制。所以他们理论上可以从现在到无限的未来。我想知道设置一些约束是否可以使索引更好?像活动时间应该在 15 年内还是什么?
另一种选择是将事件移动到另一个过去的表(archived_events)。这样事件的表大小就不会变得太大。例如,我可以有一个定期执行的 cron 作业。
我还听说对数据库运行分析/解释实际上可以提高它的性能?如果是这种情况,我应该多久运行一次?
PostgreSQL 版本:12.3
【问题讨论】:
-
实际定义(
CREATE TABLE和CREATE INDEX语句)是规范的事实来源。优于一切口头描述。请务必公开您的 Postgres 版本。
标签: postgresql indexing timestamp postgresql-performance