PostgreSQL存储大型Json字符串(如何最好地优化内存)

时间:2017-01-29 22:18:21

标签: ruby-on-rails json postgresql

我有三个表,每个表都有一个属性,在PostgreSQL数据库(在AWS RDS实例上)存储大型JSON字符串作为文本。这些JSON字段表示用于画布绘制和操作的fabric.js javascript对象。他们中的许多人都有复杂形状的svg表示,例如地图。

memory breakdown of tables with large json fields

我最初的假设是,无论何时写入数据库,我们都可以以某种方式压缩这些字段,并在需要JSON时解压缩它们。我天真地为转换编写了一个脚本,使用了bytea列类型和zlib压缩。我选择了选择记录(使用Rails ActiveRecord)来比较JSON字节大小和压缩JSON的字节大小,确认压缩版本通常大约是字节大小的一半。我想要在一个表(notebook_question_answers)上压缩JSON属性可以节省一些内存的概念证明。

在一个表的所有记录上运行我的脚本之后,我非常惊讶地发现压缩JSON字段并将它们转换为二进制类型导致数据库的ADDED内存使用量。

after zlib compression of JSON attribute with binary data type

所以我有两个问题:

  1. bytea数据类型是否有额外的开销?此特定DB属性上有许多NULL值,并且为每个二进制数据条目分配至少1-4bytes。我在PostgreSQL上读到文本针对文本进行了优化,因此您应该使用text数据类型。否则,为什么在使用压缩时会增加内存?

  2. 我开始阅读有关json vs jsonb PostgreSQL数据类型的内容。 json提供解析,jsonb为搜索提供了优化的索引,据我所知。在存储大型JSON字符串时,其中一条是减少内存消耗的好方法吗?你会建议什么?

  3. 编辑: 有问题的列最初是数据类型" text",并将其更改为bytea。

    运行以下命令后,我现在看到该表占用的空间比以前少。总字节数减少约30%。

    VACUUM(VERBOSE,ANALYZE,FULL)notebook_question_answers;

    after garbage collection

0 个答案:

没有答案