如何在 postgres 中启用索引顺序文件

How to enable index-sequential files in postgres

我正在编写一个由 Postgres DB 支持的应用程序。 应用就像一个日志系统,主要的table是这样的

create table if not exists logs
(
    user_id   bigint      not null,
    log       bytea       not null,
    timestamp timestamptz not null default clock_timestamp() at time zone 'UTC'
);

其中一个主要查询是获取关于某个 user_id 的所有 log,按时间戳 desc 排序。如果 Postgres DB 在一个页面或连续页面中存储所有大约相同的行 user_id,而不是散布在磁盘上,那将是很好的。

我在教科书上记得,这就是所谓的“索引顺序文件”吗?我怎样才能引导 Postgres 做到这一点?

简单的做法是创建一个 B-tree index 来加快搜索速度:

CREATE INDEX logs_user_time_idx ON logs (user_id, timestamp);

这会加快查询速度,但会在磁盘上占用额外的 space 并减慢 table 上的所有 INSERT 操作(必须维护索引)。天下没有免费的午餐!

当您提到“索引顺序文件”时,我假设您正在谈论它。但也许你的意思是所谓的 clustered index 索引组织的 table,它基本上使 table 本身保持一定的顺序。这可以进一步加快搜索速度。但是,PostgreSQL 没有这个功能。

在 PostgreSQL 中提高磁盘访问效率的最佳方法是 运行 CLUSTER 命令,它按索引顺序重写 table:

CLUSTER logs USING logs_user_time_idx;

但请注意:

  • 该语句重写了整个 table,因此可能需要很长时间。在此期间,table 无法访问。

  • 后续的INSERT不会维持table中的顺序,所以随着时间的推移它会“腐烂”,一段时间后你将不得不CLUSTER 再次 table。