我们在 PostgreSQL 数据库中有一个表,该表每天以数百万行的数量级增长。
每行包括:
ID
Foreign user ID
Date and time
Other data
日期和时间与 并不严格单调ID
,但它们很接近。
查询此表时,我们只对获取给定外国用户 ID 的行感兴趣,这些行的日期和时间在过去两周内。两周前的行将永远不会被查询,但是我们希望保留它们以供存档。
鉴于这个特殊用例:
- 我们应该在日期和时间列上建立索引吗?
- 是否有任何提示我们可以给出日期和时间(几乎)随 ID 单调增加的提示。
- 我们是否应该考虑尝试从表中删除超过两周的行,这可能会提高性能吗?
分割
这是表分区的经典用法。将表分成两个(或更多)部分,一个包含热数据,一个包含旧归档数据。在热表上索引任何你需要的东西,在冷表上使用更少的索引来节省空间和
insert
时间。new_table
启用约束排除后,Pg 将仅在您的查询匹配分区约束时自动扫描。如果您的查询不都使用相同的约束,您可以添加一个
where
使用约束的测试,或者直接查询new_table
分区。部分索引
或者,您可以创建仅覆盖您感兴趣的范围的部分索引。同样,只有当您的查询使用 Pg 可以识别为与部分索引匹配的约束时,这些才会起作用。在您的情况下,您必须随着时间的推移创建和删除它们以保持您的时间范围相关,因为您无法索引动态表达式,如
WHERE (some_field > current_timestamp - INTERVAL '2' week)
.