我需要一个新的 Mongo 集合,它将数据与 IP 地址相关联,该地址是集合键。我想知道使用 IP 地址的十进制表示法(例如3299551096
作为整数)而不是点分表示法(例如"198.252.206.16"
作为字符串)是否有任何性能优势。
我没有发现任何支持或反对的证据,也没有发现整数和字符串索引之间的任何性能比较。有什么理由更喜欢其中一个吗?
我需要一个新的 Mongo 集合,它将数据与 IP 地址相关联,该地址是集合键。我想知道使用 IP 地址的十进制表示法(例如3299551096
作为整数)而不是点分表示法(例如"198.252.206.16"
作为字符串)是否有任何性能优势。
我没有发现任何支持或反对的证据,也没有发现整数和字符串索引之间的任何性能比较。有什么理由更喜欢其中一个吗?
整数值存储要求较小,但当然不是很重要。数字的排序/索引算法通常会比字符串稍快,但差异会非常小,因为字符串也很短。
我不希望两者之间存在引人注目的性能差异。如果您计划存储 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.0
和192.168.0.255
.
理想情况下,无论哪种方式,您都会在该字段上有一个索引:
db.ips.ensureIndex({ addr: 1 })