gpt4 book ai didi

performance - 尽管设置了索引,但简单的 MongoDB 查询非常慢

转载 作者:可可西里 更新时间:2023-11-01 09:56:42 25 4
gpt4 key购买 nike

我有一个 MongoDB 集合,其中包含大约 1 亿个文档。

文档基本上是这样的:

_id             : ObjectId("asd1234567890")
_reference_1_id : ObjectId("fgh4567890123")
_reference_2_id : ObjectId("jkl7890123456")
name : "Test1"
id : "4815162342"
created_time : Date( 1331882436000 )
_contexts : ["context1", "context2"]
...

设置了一些索引,这是db.mycoll.getIndexes();的输出

[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "mydb.mycoll",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"_reference_1_id" : 1,
"_reference_2_id" : 1,
"id" : 1
},
"unique" : true,
"ns" : "mydb.mycoll",
"name" : "_reference_1_id_1__reference_2_id_1_id_1"
},
{
"v" : 1,
"key" : {
"_reference_1_id" : 1,
"_reference_2_id" : 1,
"_contexts" : 1,
"created_time" : 1
},
"ns" : "mydb.mycoll",
"name" : "_reference_1_id_1__reference_2_id_1__contexts_1_created_time_1"
}
]

当我执行这样的查询时

db.mycoll.find({"_reference_2_id" : ObjectId("jkl7890123456")})

无论是否有结果,都需要一个多小时 (!) 才能完成。有什么想法吗?

更新:这是

的输出
db.mycoll.find({"_reference_2_id" : ObjectId("jkl7890123456")}).explain();

看起来像:

{
"cursor" : "BasicCursor",
"nscanned" : 99209163,
"nscannedObjects" : 99209163,
"n" : 5007,
"millis" : 5705175,
"nYields" : 17389,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {

}
}

最佳答案

您没有任何 mongo 会自动为此使用的索引,因此它正在进行全表扫描。

the docs中所述

If the first key [of the index] is not present in the query, the index will only be used if hinted explicitly.

为什么

如果您在 a,b 上有一个索引 - 并且您单独按 a 进行搜索 - 将自动使用一个索引。这是因为它是索引的开始(这样做很快),数据库可以忽略索引值的其余部分。

当单独通过 b 搜索时,a,b 上的索引低效,因为它不提供使用“starts with thisfixedstring”索引搜索的可能性.

所以,要么:

  • 在查询中包含 _reference_1_id(可能不相关)
  • 或在 _reference_2_id 上添加索引(如果您经常按该字段查询)
  • 或使用提示

提示

可能是您目前成本最低的选择。

添加查询提示以强制使用您的 _reference_1_id_1__reference_2_id_1_id_1 索引。这可能比全表扫描快很多,但仍然比以您在查询中使用的字段开头的索引慢很多。

db.mycoll
.find({"_reference_2_id" : ObjectId("jkl7890123456")})
.hint("_reference_1_id_1__reference_2_id_1_id_1");

关于performance - 尽管设置了索引,但简单的 MongoDB 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9734962/

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