我在 Postgres 8.2 数据库中有一个与此类似的关系:
CREATE TABLE foo (
foo_id varchar(160) NOT NULL,
bar_id varchar(160) NOT NULL,
created bigint NOT NULL,
PRIMARY KEY (foo_id, bar_id)
);
Run Code Online (Sandbox Code Playgroud)
让我们暂时搁置 PK 是复合的并使用 varchars(不是我的选择,遗留产品等)这一事实。
目前,我们的应用程序从不发出包含created在 WHERE 子句中的查询,因此它没有被索引。但是,我们有一个新要求,要求我们查询一系列created值。建议的查询是这样的:
SELECT * FROM foo WHERE foo_id IN (...) AND created > 1234 AND created <= 6789
Run Code Online (Sandbox Code Playgroud)
这 foo表在我们的应用程序中很容易成为最大的,但即便如此,即使在最大的部署中也很可能少于 50,000 行,并且很少有超过十多行具有相同的foo_id.
我的问题是,created考虑foo_id到 PK 的一部分,是否应该在列上添加索引?如果是这样,仅对created列进行索引还是对 ( foo_id, created)进行索引有意义吗?
我对上述语句的 EXPLAIN 显示正在使用 PK,然后正在应用 FILTER 操作。使用测试数据,性能似乎不错。如果表增长到很大,我担心的是性能。
谢谢!