【问题标题】:MongoDB - How Index prefixe works?MongoDB - 索引前缀如何工作?
【发布时间】:2019-06-23 08:33:12
【问题描述】:

我已阅读此文档:“Sort and Non-prefix Subset of an Index

有了这些信息。我正在尝试回答这个 MongoDB 模拟测试问题,他们的问题是

您在 things 集合上有以下索引:

    [
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.things"
    },
    {
        "v" : 1,
        "key" : {
            "a" : 1
        },
        "name" : "a_1",
        "ns" : "test.things"
    },
    {
        "v" : 1,
        "key" : {
            "c" : 1,
            "b" : 1,
            "a" : 1
        },
        "name" : "c_1_b_1_a_1",
        "ns" : "test.things"
    }
]

问题: 以下哪个查询需要您将每个文档加载到 RAM 中才能完成查询?假设在查询期间没有写入数据。勾选所有适用项。


db.things.find( { b : 1 } ).sort( { c : 1, a : 1 } )

db.things.find( { c : 1 } ).sort( { a : 1, b : 1 } )

db.things.find( { a : 1 } ).sort( { b : 1, c : 1 } )

他们给出的答案是……

db.things.find( { b: 1} ).sort( {c: 1, a: 1} )

有人可以帮我理解为什么其他 2 个选项不正确,即他们如何使用索引/索引前缀。我的理解是 SORT 部分必须匹配索引列顺序。此外,建议的正确答案似乎也不符合规则(根据文档)。

【问题讨论】:

标签: mongodb indexing


【解决方案1】:

我相信,鉴于选项和答案,重点是找到:

以下哪些查询需要您将每个文档加载到 RAM 中才能完成查询

所以排序是一个红鲱鱼。

  • find({ b: 1 }) 无法使用提供的任何索引
  • find({ c: 1 }) 可以使用索引c_1_b_1_a_1,因为它匹配前缀
  • find({ a: 1 })可以使用索引a_1

由于选项#2 和#3 可以使用索引,它们不会加载每个文档来对它们进行排序,只会加载通过索引找到的文档。选项 #1 必须进行完整的集合扫描才能找到 b1 的文档。

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多