适合在 PostgreSQL 中存储 16K 二进制块的列类型

Appropriate column type for storing 16K binary blocks in PostgreSQL

我的应用程序需要在 Postgres 数据库中存储数百万个二进制块(每秒可能到达几千个)。大多数块的大小为 16K,但有些可能更小。我知道我可以使用 text、bytea 或 blob 列,或者我可以将二进制数据存储在数据库外部的文件中,并将它们的路径放在 table.

考虑到 高写入吞吐量 是我最重要的目标,哪个选项最适合我的情况?

尝试所有选项,对它们进行基准测试,找出最适合您的选项。

bytea 是这里的明智选择 - 几乎是唯一的选择。

使用textvarchar没有优势。不要在其中存储编码的二进制文件。这是一个你应该立即忽略的选项。

PostgreSQL 中没有 blob 类型。我想你的意思可能是 lob,它是 oid 的包装器,用于在 pg_largeobject table 中查找 "large objects"。当您需要数据库中的虚拟 "files" 时,这很有用,您可以在其中查找、覆盖、追加等,但它根本不适合您的用例。

可以存储路径或文件名然后在外部查找它们,但是您将拥有很多非常小的文件.您还需要一个侧通道供客户端读写它们,因为您不能直接使用 PostgreSQL 协议。您需要分别处理 backup/restore 和复制它们。如果事务回滚或相应的数据库元组被删除,它们将不会被删除,因此您需要一个清理系统来删除不再需要的文件。它会变得凌乱。当文件很大、寿命长且大部分是静态文件时,这样做是值得的,但听起来对您来说并非如此。

直接将二进制存储在bytea列中,最好使用PgJDBC中的二进制协议支持或libpq在客户端和服务器之间交换bytea值而不需要编码。在您写入的 table 上有最少的索引。 (在某些情况下,您甚至可以不定义主键,但这是专家级别的选项)。如果您不介意在计划外重启时丢失 table 中的数据,请使用未记录的 table。否则批量写入并使用异步提交 and/or 提交延迟。

另见 How to speed up insertion performance in PostgreSQL