在MySQL中存储序列化对象和性能

时间:2011-10-12 14:17:07

标签: php mysql serialization innodb

我们希望将序列化对象与唯一内部ID一起存储在表中。 我们只想读/写/(很少)更新行。 我们永远不会只是ID与序列化字段进行交互。 我们正在使用InnoDB,

首先;

将序列化存储为文本类型字段是否正确?

其次;

如果我们不直接与r / w之外的序列化字段进行交互,它会影响我们数据库的性能吗?

最后;

将序列化对象存储在我们的文件系统中会更好吗?

为了深入了解我们为什么首先存储它们,我们从供应商处收到一个对象,用户需要选择几个选项,我们需要将修改后的(选定的)对象发送回去组件。

3 个答案:

答案 0 :(得分:6)

  1. 是将其存储为文本字段(类型TEXT)是正确的,但如果您担心字符编码,也可以将其存储为二进制文件(类型BLOB)。

  2. 不,如果您只是通过ID查找主键,那么它不应该有太多的性能影响。

  3. 如果您使用MySQL来存储ID,那么您也可以将序列化对象存储在表中,除非您有大量的序列化数据可能会占用大量的磁盘空间,但随后将其存储在文件系统会遇到同样的问题。

答案 1 :(得分:3)

  

首先;

     

将序列化存储为文本类型字段是否正确?

是的,我建议你采用二进制编码。 Blob可能更适合当时的文本IIRC。只是阻止任何类型的编码,只需将其存储为二进制文件。

  

其次;

     

如果我们不直接与r / w之外的序列化字段进行交互,它会影响我们数据库的性能吗?

不再像是任何其他数据一样。

  

最后;

     

将序列化对象存储在我们的文件系统中会更好吗?

由于这些数据大多是较小的数据块,我更喜欢数据库,因为它可以处理比每个序列化块有一个文件的文件系统更小的数据块。

答案 2 :(得分:3)

这听起来像一个简单的键 - >值设置 - 一个表,两列,第一个主键,没有额外的索引。如果您的对象很大,MySQL就不适合这个。如果它们很小,你可能就好了。我认为大约12k左右的东西太大了。 InnoDB页面是16k,如果每个条目的开销占用多个页面,那么你就开始乱七八糟了。

如果使用足够的文件夹分隔来破坏对象,文件系统擅长处理此问题。如果一个目录中有一百万个文件,它们通常会出现问题。如果该临界点因文件系统而异,那么您将不得不进行一些研究。这意味着一些自定义代码。

MongoDB非常适合key->值范例,并且在处理对象存储方面比MySQL更好。

最后,如果我们谈论的记录少于1,000,000条记录并且总数少于10gb,那么就把它放在MySQL上继续进行。我认为,无论如何,你都需要进行基准测试。