【问题标题】:mongodb: Multikey indexing structure?mongodb:多键索引结构?
【发布时间】:2011-11-15 19:25:25
【问题描述】:

我发现很难理解 mongodb 中的多键索引是如何完成的。

这是我在其网站上的 mongodb 文档中读到的关于多键的内容:
1) “在数组元素索引上创建索引会导致数据库索引数组的每个元素”
2) "...将索引文档上的所有标签,并为该文档创建索引条目为"X"、"Y"和"Z"。"

那么,该文档的索引条目到底是什么意思?每个文档是否记住条目,在这种情况下搜索将是全表扫描?或者是mysql的同一个b-tree索引,每个索引条目将指向每个相应的多个文档,在这种情况下我想太多了。

举个例子:

obj1 = { 
    name: "Apollo",
    text: "Some text about Apollo moon landings",
    tags: [ "moon", "apollo", "spaceflight", "nasa" ]
}
obj2 = { 
    name: "Atlantis",
    text: "Some text about Atlantis flight missions",
    tags: [ "space", "atlantis", "spaceflight", "nasa" ]
}
db.articles.ensureIndex( { tags : 1 } )

请帮我理解!提前谢谢。

【问题讨论】:

    标签: mongodb indexing mongodb-indexes


    【解决方案1】:

    我认为您误解了 Multiindex 和 Compound 索引之间的区别:

    复合索引是用户一次为多个字段定义的索引。 多键索引:MongoDB判断释放Index的字段是否为数组,为每个数组元素创建索引,例如

    db.user.ensureIndex({"address.street":1});

    在这种情况下,由于目标字段是一个数组,索引将存储所有项目,但只存储一次。

    我强烈建议您看看这篇简单的文章,它将澄清您对 MongoDB 中简单的 imdex 类型的疑虑:http://mongodbspain.com/en/2014/01/24/mongodb-indexes-part1/

    问候,

    【讨论】:

    • 链接的教程很好,像 Thilo 的回答中给出的例子会更有助于理解。
    【解决方案2】:

    在这种情况下,您的索引(即 B 树)将如下所示:

     apollo => [ obj1 ]
     atlantis => [ obj2 ]
     moon => [ obj1 ]
     nasa  => [ obj1, obj2 ]
     space => [ obj2 ]
     spaceflight => [ obj1, obj2 ]
    

    这只是一个“常规”的 B-tree 索引,除了每个文档可以出现多次(对于每个唯一的标签值,它出现一次)。

    【讨论】:

    • 太棒了!感谢您的澄清。你刚刚证明我想多了! :)
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多