gpt4 book ai didi

使用点表示法的 Mongodb 查询速度慢

转载 作者:可可西里 更新时间:2023-11-01 09:32:06 29 4
gpt4 key购买 nike

我有这个文档结构:

{
"key": {
"a": Int32,
"b": String
}
}

key 上有唯一索引,在 key.akey.b 上有索引(非唯一)。

然而,此查询扫描(慢):

{"key.a": 456213154}

并且这个查询没有:

{"key": {
"a": 456213154,
"b": {"$exists": true}
}}

为什么这是必要的,应该这样做吗?

(我应该提到这是 v2.0.3)

编辑:添加说明:

> db.collection.find({"key.a": 456213154}).explain()
{
"cursor" : "BtreeCursor key.a_1",
"nscanned" : 10962,
"nscannedObjects" : 10962,
"n" : 10962,
"millis" : 20,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"key.a" : [
[
456213154,
456213154
]
]
}
}
> db.collection.find({"key": {"a": 456213154, "b": {"$exists":true}}}).explain()
{
"cursor" : "BtreeCursor key_1",
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"key" : [
[
{
"a" : 456213154,
"b" : {
"$exists" : true
}
},
{
"a" : 456213154,
"b" : {
"$exists" : true
}
}
]
]
}
}

编辑:我尝试删除两个非唯一索引(key.a_1key.b_1)以查看这是否会影响查询。它不是:

> db.collection.find({"key.a": 456213154}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 23240518,
"nscannedObjects" : 23240518,
"n" : 10962,
"millis" : 15047,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {

}
}

最佳答案

您的 explain() 输出表明:

  1. 有 10962 个对象具有 key.a : 456213154。您的 db.collection.find({"key.a": 456213154}) 查询使用了 key.a 上的索引,并返回了 10962 个对象。

  2. 您的集合中有 0 个对象具有 key.a : 456213154key.b : { $exists : true } db.collection.find({"key": {"a": 456213154, "b": {"$exists":true}}}) 查询确实使用了键上的索引。

查看每个查询的 n 值 - 这是返回的数字;和 cursor 值 - 如果使用索引,则为 BtreeCursor。在这种情况下,为什么第一个查询需要更长的时间是有道理的,因为它要返回的对象要多得多。

您确定具有 key.a : 456213154 值的文档也具有 key.b 值吗?

编辑:

带有 $exists 参数的查询是检查嵌入文档中是否存在的错误语法。

试试 db.collection.find({ "key.a": 456213154, "key.b": { "$exists": true } })

关于使用点表示法的 Mongodb 查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12842632/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com