mongodb:复合multiKey索引有效,但是本质上很慢吗?

问题描述 投票:0回答:1

mondodb doc

如果文档的一个以上要索引的字段是一个数组,则无法创建复合多键索引。

但是在different place in the docs上却说:

以下操作在stock.size和stock.quantity字段上创建多键索引:

db.inventory.createIndex({“ stock.size”:1,“ stock.quantity”:1})

复合多键索引可以支持带有谓词的查询, 包括索引字段以及仅包含谓词的谓词 索引前缀

这两个语句不能一起使用。

我遵循了下一页给出的示例。这是一个简化的版本:

db.inventory.drop({})

db.createCollection("inventory")

db.inventory.insert(
{
  _id: 1,
  item: "abc",
  stock: [
    { size: "S", color: "red", quantity: 25 }
  ]
}
)

db.inventory.createIndex( { "stock.size": 1, "stock.quantity": 1 } )

db.inventory.find( { "stock.size": "M" } )
db.inventory.find( { "stock.size": "S", "stock.quantity": { $gt: 20 } } ).explain()

重点是,我可以创建复合多索引。但是查询计划显示它不能完全应用它:

query plan

它使用复合索引进行索引扫描。但是,在FETCH阶段,仍然需要过滤实际上是索引的第二部分的字段。这意味着它实际上并未应用索引的第二部分。

这意味着,当有大量数据时,这样的查询本质上将很慢。

现在我的问题:

我的发现正确吗?确实是第二个文档(与第一个文档矛盾)正确。还是我忽略了某些东西。因为...当我说得对时,我们这里有一个大问题:-o :-D

mongodb multi-index
1个回答
0
投票

没有矛盾。您在示例中提供的文档只有一个数组。您引用的页面带有相关的引号:

您可以在{“ a.x”:1,“ a.z”:1}上创建复合索引。也适用于最多一个索引字段可以是数组的限制。

在这种情况下,唯一的数组是a

关于部分使用的索引,这似乎是正确的,但是您创建的索引可以用于使用顶级文档中数组中的文档字段来强制唯一性:

MongoDB Enterprise ruby-driver-rs:PRIMARY> db.inventory.createIndex( { "stock.size": 1, "stock.quantity": 1 } ,{unique:true})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "commitQuorum" : "votingMembers",
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1591841133, 7),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1591841133, 7)
}
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.inventory.insert({stock:[{size:1,color:1}]})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.inventory.insert({stock:[{size:1,color:1}]})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: test.inventory index: stock.size_1_stock.quantity_1 dup key: { stock.size: 1.0, stock.quantity: null }"
        }
})
© www.soinside.com 2019 - 2024. All rights reserved.