php - PostgreSQL 和 PHP : Storing large files in multiple schemas: BLOB or BYTEA

标签 php postgresql pdo

我需要在 Postgres 数据库中存储大文件(从几 MB 到 1GB)。数据库有多个模式。看起来 Postgres 有 2 个选项来存储大对象:LOB 和 BYTEA。然而,我们似乎在使用这些选项时都遇到了问题。

  1. LOB。这几乎是理想的效果,最多可以存储 2GB 并允许流式传输,这样我们在读取 LOB 时就不会达到 PHP 后端的内存限制。然而,所有 blob 都存储在 pg_catalog 中,并且不是架构的一部分。当您尝试使用带有选项 –n 和 –b 的 pg_dump 来转储一个模式及其 Blob 时,这会导致一个大问题。它正确转储架构数据,但是它包含数据库中的所有 blob,而不仅仅是属于特定架构的 blob。 有没有办法使用 pg_dump 或其他实用程序转储单个模式及其 blob?

  2. 字节跳动。这些是按模式正确存储的,因此 pg_dump –n 可以正常工作,但我似乎找不到流数据的方法。这意味着如果数据大于内存限制,则无法从 PHP 访问数据。

是否有其他方法可以在 Postgres 中存储大数据,允许流式传输并正确地处理每个数据库的多个架构?

谢谢。

最佳答案

尽管使用 bytea 不支持流/文件风格 API,但您可以使用它仅获取部分内容,因此它支持“分块”。

您需要将 bytea 列的存储模式设置为“外部”以禁用压缩,然后您可以在 bytea 列上使用 substring 来仅获取其中的一部分。至少根据文档,这将 DTRT 并有效地仅访问数据库端值的必要部分: http://www.postgresql.org/docs/current/static/storage-toast.html

因此创建一个类似于这样的架构:

create table media.entity(entity_id serial primary key, content bytea not null);
alter table media.entity alter column content set storage external;

然后从内容中获取 8Kb:

select substring(content, 1, 8192) from media.entity where entity_id = 1;
select substring(content, 8193, 8192) from media.entity where entity_id = 1;

不幸的是,TOAST 数据的获取似乎没有计入 explain (buffers on) 计数中,因此很难验证数据库是否按照文档所述执行操作。

关于php - PostgreSQL 和 PHP : Storing large files in multiple schemas: BLOB or BYTEA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12817118/

相关文章:

sql - 尝试从两个 PostgreSQL 数据库导入数据库时​​出现语法错误

php - 如何更新两个独立 ID 的列?

PHP7 MySQL 'expiry_date' PDO 数据库安装的默认值无效

javascript - 从ajax调用获取字符串版本

PHP foreach 循环数组

python - Django 2 + PostgreSQL FullText 搜索不匹配它应该的

javascript - Sequelize : Modify output of date timestamp using Getters

php - OOP PDO 获取 while 循环

PHP mysql_real_escape_string();使用 mysqli 的正确方法是什么?

php - 为什么这个 PDO 语句会默默地失败?