【问题标题】:Storing serialized objects in MySQL and performance在 MySQL 中存储序列化对象和性能
【发布时间】:2011-10-12 14:17:07
【问题描述】:

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

首先;

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

其次;

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

终于;

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

为了稍微了解我们首先存储它们的原因,我们从供应商处收到一个对象,用户需要选择几个选项,我们需要将修改后的(选定的)EXACT 对象发回组件。

【问题讨论】:

  • “我们永远不会只与序列化字段交互 ID”——什么?
  • 抱歉很难解释,我的意思是我们永远不想订购或搜索该领域。我试图避免人们想要在所述字段上执行操作的几乎相同问题的其他实例。

标签: php mysql serialization innodb


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

    李>
  2. 不,如果您只是通过作为主键的 ID 进行查找,那么它应该不会对性能产生太大影响。

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

【讨论】:

  • TEXT 的字段还存储字符编码信息,这对于存储序列化对象等操作来说是不可取的。应该是不存储编码信息的字段,如BLOBVARBINARY
【解决方案2】:

首先;

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

是的,我建议您对其进行二进制编码。 Blob 可能更合适,即文本 IIRC。只要防止任何形式的编码,只需将其存储为二进制即可。

其次;

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

不像是其他任何数据。

终于;

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

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

【讨论】:

    【解决方案3】:

    这听起来像一个简单的键-值设置——一个表,两列,第一个主键,没有额外的索引。如果你的对象很大,MySQL 不适合这个。如果它们很小,您可能还好。我认为任何超过 12k 的东西都太大了。 InnoDB 页面为 16k,如果每个条目及其开销都占用超过一页,那么您将开始变得一团糟。

    如果您使用适当的文件夹分隔来分解对象,文件系统就可以很好地处理这个问题。如果您在一个目录中有一百万个文件,他们通常会遇到问题。该临界点的位置因文件系统而异,因此您必须进行一些研究。这意味着一些自定义代码。

    MongoDB 非常适合 key->value 范式,并且比 MySQL 更擅长处理对象存储。

    最后,如果我们说的记录少于 1,000,000 条且总容量少于 10gb,只需将其放在 MySQL 上并继续前进。我认为在重要的一点上,您无论如何都需要进行基准测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      相关资源
      最近更新 更多