我可以通过将ASCII字符串转换为字节来节省Mongodb索引中的空间吗?

时间:2012-06-18 21:12:56

标签: mongodb utf-8 bson mongodb-java

我有很多以语言代码为对象的对象。由于Java和Mongodb本身都使用UTF-8,并且因为语言代码是ASCII,所以它们应该每个字符加1个字节加上\ 0终止符。所以语言代码“en”在BSON对象和索引中只需要3个字节。

这是对的吗?我想知道我是否通过将字段转换为字节数组来保存任何内容,如:

byte[] lcBytes = langCode.getBytes("ISO-8859-1");

在使用Java驱动程序将它们保存到Mongodb之前?

1 个答案:

答案 0 :(得分:3)

根据bson spec,它没有什么区别:

string  ::= int32 (byte*) "\x00"
binary  ::= int32 subtype (byte*)

换句话说,字符串是零终止的(因此浪费了一个字节),而二进制文件需要一个单字节的子类型字段。

当然,完美匹配的字符集可能更高效,因为字节数组本身可能更小(例如,对于您经常需要的字符不需要三个字节,但只需要一个字节)。再说一次,我几乎不认为这是值得的麻烦,因为它使得无法使用正则表达式,map / reduce,js函数等。也许对于非常的弧度字符集,但8859-1并不是太特别。

作为旁注,请记住index size is limited to about 1k,因此你不能在索引中抛出很长的字符串(并且在性能方面不是一个好主意)。

如果您只需要通过相等查询,也许您可​​以选择哈希?如果您需要存储非常大的字符串(非索引),压缩算法可能是个好主意。