4

我需要一个新的 Mongo 集合,它将数据与 IP 地址相关联,该地址是集合键。我想知道使用 IP 地址的十进制表示法(例如3299551096作为整数)而不是点分表示法(例如"198.252.206.16"作为字符串)是否有任何性能优势。

我没有发现任何支持或反对的证据,也没有发现整数和字符串索引之间的任何性能比较。有什么理由更喜欢其中一个吗?

4

1 回答 1

4

整数值存储要求较小,但当然不是很重要。数字的排序/索引算法通常会比字符串快,但差异会非常小,因为字符串也很短。

我不希望两者之间存在引人注目的性能差异。如果您计划存储 IPV6 地址,问题将是 BSON ( http://bsonspec.org/#/specification ) 没有用于存储 16 字节数字的简单数据类型,因此它不一定是自然适合仅存储为数字。

最后,如果您想避免从存储到屏幕的转换,或者如果您想让我们大多数人更自然地编写查询,我可能只使用字符串 :):

db.ips.find({addr: "192.168.1.1"})

如果使用字符串,我还建议您考虑存储为固定格式的字符串,例如192.168.001.001如果您想做更复杂的搜索,例如范围搜索。由于以一致的固定格式存储的字符串会自然排序,因此您可以以比其他方式更多的方式使用它。如果范围不重要,则没有必要以这种方式存储。

使用固定格式,您可以执行如下查询:

db.ips.find({ addr: {
                 $gte: "192.168.000.000",
                 $lte: "192.168.000.255" } })

这将找到(包括)192.168.0.0192.168.0.255.

理想情况下,无论哪种方式,您都会在该字段上有一个索引:

db.ips.ensureIndex({ addr: 1 })
于 2013-11-13T19:15:44.167 回答