如何解决如何在 postgres 中启用索引顺序文件
我正在编写一个由 Postgres DB 支持的应用程序。 应用就像一个日志系统,主表是这样的
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'
);
主要查询之一是获取关于某个 log
的所有 user_id
,按时间戳降序排列。如果 Postgres DB 在一个页面或连续页面中存储大约相同 user_id
的所有行,而不是在磁盘上到处散布,那就太好了。
我从教科书中记得,这就是所谓的“索引顺序文件”吗?我如何指导 Postgres 做到这一点?
解决方法
最简单的方法是创建一个 B-tree index 以加快搜索速度:
CREATE INDEX logs_user_time_idx ON logs (user_id,timestamp);
这会加快查询速度,但会占用额外的磁盘空间并减慢表上的所有 INSERT
操作(必须维护索引)。天下没有免费的午餐!
当您提到“索引顺序文件”时,我假设您正在谈论那个。但也许您的意思是所谓的 clustered index 或 索引组织表,它基本上将表本身保持在特定顺序中。这样可以进一步加快搜索速度。但是,PostgreSQL 没有这个功能。
在 PostgreSQL 中提高磁盘访问效率的最佳方法是运行 CLUSTER
命令,该命令按索引顺序重写表:
CLUSTER logs USING logs_user_time_idx;
但请注意:
-
该语句重写了整个表,因此可能需要很长时间。在此期间,该表无法访问。
后续的
INSERT
不会保持表格中的顺序,因此它会随着时间的推移“腐烂”,过一段时间您将不得不再次CLUSTER
表格。>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。