2010-04-29 108 views
4

在将GZIP文本数据插入数据库之前,更大的应用程序和数据库对GZIP文本数据常见吗?存储GZIP:编辑文本在MySQL?

我猜猜在实际文本字段上的任何全文搜索在再次解压之前都不会工作?

回答

2

我从来没见过这个做了很多工作,因为它基本上防止从一个对MySQL的侧上的数据做任何操作:

  • 没有全文,是
  • 也没什么like,无=,没有其他操作...

但是,如果您只使用数据库来存储该数据,而不是操纵它,那可能很有趣。

注意:您可能需要执行一些基准测试来衡量这可能会带来的性能影响,因为压缩/解压缩需要CPU!


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

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

0

坏主意。当磁盘空间低于1 GB时,额外的处理可以节省一些空间,这不会抵消额外的编程时间来完成这项任务(不仅仅是初始化,还记得维护)。

由于数据需要解压缩/压缩,这可能会使数据库访问速度变慢。索引不会在压缩数据上正常工作,因为您需要执行表扫描,解压缩数据,然后进行比较。全文搜索也是一样。

如果您必须这样做,请不要使用gzip。使用内置的COMPRESS功能。

+6

在应用程序层中有一些有效的压缩用例。每当你存储大量的文本数据,但不需要进行搜索时,它是一个很好的候选项,例如归档日志输出。在数据到达数据库之前对数据进行Gzip处理,可将1MB记录下降到30k。尽管直接磁盘空间很便宜,但在运行mysqldumps时也必须考虑IO限制,或者在从应用程序服务器到数据库服务器的网络中进行访问时。如果你在创建一个从设备时运行了一个锁定的'mysqldump --master-data',你会希望减小db的大小。 – 2012-10-03 17:49:44

4

如果您在MySQL中使用InnoDB表类型并使用最新版本之一,那么可以启用compression on an InnoDB表本身。

它在低层管理,所以不会改变你的查询或任何东西。从我读过的内容来看,轻微的压缩开销通过减少磁盘IO并允许更多数据存储在内存中的缓冲池中得到抵消。但是,您提到了InnoDB不支持的全文搜索,因此这可能不是一种选择。

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

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