如何在 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。
我正在编写一个由 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。