【问题标题】:Store GZIP:ed text in mysql?在 mysql 中存储 GZIP:ed 文本?
【发布时间】:2024-01-10 05:29:02
【问题描述】:

大型应用程序和数据库在将文本数据插入数据库之前对其进行 GZIP 压缩是否很常见?

我猜在重新解压缩之前,对实际文本字段的任何全文搜索都将无法正常工作?

【问题讨论】:

    标签: php mysql gzip


    【解决方案1】:

    我还没有看到这样做太多,因为它基本上可以防止人们对 MySQL 端的数据进行任何操作:

    • 没有全文,是的
    • 但也没有like,没有=,没有其他操作......

    不过,如果您只使用数据库来存储数据,而不是对其进行操作,那可能会很有趣。

    注意:您可能需要做一些基准测试,以衡量这可能产生的性能影响,因为压缩/解压缩需要 CPU!


    之后,问题是:您会在客户端(PHP)端还是在服务器(MySQL)端处理压缩?

    在第二种情况下,有一个由 MySQL 提供的 COMPRESS() 函数,您可能会感兴趣。

    【讨论】:

      【解决方案2】:

      如果您在 MySQL 中使用 InnoDB 表类型和较新的版本之一,则可以启用 compression on an InnoDB 表本身。

      它在低级别进行管理,因此不会更改您的查询或任何内容。根据我的阅读,压缩的轻微开销通过减少磁盘 IO 并允许将更多数据存储在内存中的缓冲池中来抵消。但是,您确实提到了 InnoDB 不支持的全文搜索,因此这可能不是一个选项。

      MySQL 中还有一个Archive 表类型,但我相信除了主键之外,您还失去了索引功能。

      另一种选择是“打包”一个 MyISAM 表,但我相信这会使该表只读并且不会像其他选项那样压缩。

      【讨论】:

      • 更新。自 2013 年 2 月 5 日发布的 MySQL 5.6 以来,InnoDB 确实支持全文搜索。
      【解决方案3】:

      坏主意。当磁盘空间小于 $1 GB 时为节省一些空间而进行的额外处理不会抵消执行此操作的额外编程时间(不仅仅是最初,请记住维护)。

      这可能会使数据库访问速度变慢,因为需要对数据进行解压缩/压缩。索引在压缩数据上无法正常工作,因为您需要进行表扫描,解压缩数据,然后进行比较。全文搜索也已推出。

      如果必须这样做,请不要使用 gzip。使用内置的COMPRESS 函数。

      【讨论】:

      • 在您的应用程序层中有一些有效的压缩用例。每当您存储大量文本数据但不需要对其进行搜索时,这是一个很好的选择,例如归档日志输出。在数据到达数据库之前对其进行 Gzip 压缩,可以将 1MB 的日志减少到 30k。虽然直接磁盘空间很便宜,但在运行 mysqldumps 时,或者只是在通过网络本身从应用服务器到数据库服务器时,您还必须考虑 IO 限制。如果您在为生产设置从属服务器时曾经运行过锁定 mysqldump --master-data,您将希望减少数据库大小。