首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb:复合multiKey索引可以工作,但本质上是缓慢的?

mongodb:复合multiKey索引可以工作,但本质上是缓慢的?
EN

Stack Overflow用户
提问于 2020-06-11 00:05:20
回答 1查看 193关注 0票数 0

mondodb医生

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

然而,在一个在文档中的不同位置上,它说:

以下操作在stock.size和stock.quantity字段上创建多键索引: db.inventory.createIndex( { "stock.size":1,"stock.quantity":1}) 复合多键索引可以支持包含索引字段以及仅包含索引前缀的谓词的查询。

这两种说法不一致。

我遵循后一页的例子。以下是一个简化的版本:

代码语言:javascript
复制
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()

重点是,我可以创建复合多索引。然而,查询计划显示它没有完全应用它:

它使用复合索引进行索引扫描。然而,在获取阶段,它仍然需要对字段进行筛选,这实际上是索引的第二部分。这意味着它实际上没有应用索引的第二部分。

这意味着,当有大量数据时,这样的查询就会本质上是缓慢的。

现在我的问题:

我的发现正确吗?是真正的第二个医生(这与第一个相矛盾)正确。还是我忽略了什么。因为..。当我说得对的时候,我们这里有个大问题:-o :-D

EN

回答 1

Stack Overflow用户

发布于 2020-06-11 02:08:09

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

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

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

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

代码语言:javascript
复制
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 }"
        }
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62315053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档