【问题标题】:Performance impact of index datatype in MongoDB?MongoDB中索引数据类型的性能影响?
【发布时间】:2013-11-26 11:16:15
【问题描述】:

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

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

【问题讨论】:

    标签: performance mongodb indexing


    【解决方案1】:

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

    我预计两者之间不会有引人注目的性能差异。如果您打算存储 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 之间的所有 IP 地址。

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

    db.ips.ensureIndex({ addr: 1 })
    

    【讨论】:

    • 查询中可能有一个区别,在 int 上进行范围搜索比在字符串上进行范围搜索更容易
    • 会吗?为什么?如果地址存储一致,则什么都不会出现。也许这就是问题所在。应该是###.###.###.###
    • 字符串格式通常意味着您需要使用正则表达式,这就是我想到的
    • 谢谢——我添加了关于固定格式的评论。我不希望在大多数情况下需要正则表达式。
    • 那我们来找一个字符串索引吧。没想到固定格式。我不应该需要范围查询,但你永远不知道会发生什么。
    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多