我需要将数据保存在 Aerospike 中。这个引擎确实支持'bins'('bin'就像一行中的列或记录中的字段)。另一方面,我可以将我的记录保存为序列化的 blob。记录以原子方式从数据库中提取。也就是说,我不需要获取记录的一些“列”,我需要完全记录。
问题是:就性能而言,为这种情况保留数据的最有效方法是什么?保持未序列化并使用“bins”来描述所有记录的字段,还是将其作为序列化 blob 存储在 1 列中?
如果您确定您唯一的用例是获取完整记录,而不是单个 bin,则最好将其存储为单个 bin 值。(在内部,多个 bin 将需要多个超出大小限制的 malloc)。事实上,您可以将命名空间配置选项设置为“single-bin true”,这将进一步优化事情。请注意,一旦设置了此配置选项,即使重新启动节点也永远无法取消设置。如果要更改此配置,则必须清洁驱动器。如果命名空间在内存中,显然这个限制是不适用的。
将来,如果有可能访问 bin 的子集,存储为 bin 会更好。因为它将节省网络 I/O,这将比 malloc 开销大得多。
顺便说一句,如果将它们存储为 BLOB,则选择更好的序列化机制可以进一步优化网络 I/O 方面的操作。
在我们的一个用例中,我们从默认 Java 序列化切换到 Kryo 序列化,结果,由于传输的数据量较少,数据大小减少到三分之一,客户端的 Aerospike 响应时间减少了一半。