保存在PostgresSQL上之前压缩字符串是否有价值?

时间:2019-02-10 23:12:57

标签: php postgresql compression

我们正在将加密的文件内容存储在PostgresSQL数据库中。我们存储了很多。目前,我们无法在其他任何地方(例如FTP或内部存储设备)写入此内容。仍然我们的数据库变得越来越快。

我已经知道PostgreSQL默认是压缩字符串数据,所以我的问题是:在将数据插入数据库之前是否值得在应用程序端进行字符串压缩。这样会节省空间吗?

也许您知道在将文件存储在PostgreSQL表中时如何调整PostgreSQL或任何其他方法来节省空间。


我的扩展答案

我想了解更多,所以我做了几次实验。

  • 我创建了具有 20000行的源文件,其中 1行= 50000个随机字符
  • 创建的文件,其中1行是使用gzdeflate从源文件压缩的​​行
  • 我创建了一个只有一列的表格,并将每一行插入为1行。
  • 尺寸比较

结果如下:

  • 源文件-〜1GB
  • 每行压缩的文件- 4.45MB
  • text STORAGE EXTENDED-表格大小 13MB
  • text STORAGE EXTERNAL-表格大小 1MB +吐司 1027MB
  • bytea带有预gzdefdefed数据-表大小 5.2MB

我想指出,可以使用STORAGE EXTENDED预先压缩和存储数据为文本,结果是 700kb 表大小 BUT 预先压缩的数据包含字符超出大多数字符集调色板。检索这些数据将是不可能的。

结论:

  • 如果您更喜欢将数据存储为text,则每〜1GB内容大约有13MB的存储空间。
  • 如果您需要更好的压缩,并且不介意将数据存储为blob / bytea并创建其他脚本来管理插入/检索的数据……那么……考虑一下这几MB是否值得。
  • 还请记住:默认情况下,PostgreSQL正在压缩字符串>2kb。如果您的字符串少于2000个字符,则必须自行更改此设置或压缩数据。

1 个答案:

答案 0 :(得分:3)

有关详细信息,请参见the documentation

PostgreSQL的压缩算法很快,但是效果不是很好,因此可以在保存数据之前先压缩数据来节省空间。

但是随后您应该更改表以对列使用EXTERNAL存储策略。否则,PostgreSQL将通过压缩已压缩的值来不必要地浪费CPU周期,只是意识到它们不会变小并以原始方式存储它们。