gpt4 book ai didi

mongodb - Mongodb - 索引变慢

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

我在一个集合中有大约 1000000 个文档(随机生成)。

示例文档:

{
"loc": {
"lat": 39.828475,
"lon": 116.273542
},
"phone": "",
"keywords": [
"big",
"small",
"biggest",
"smallest"
],
"prices": [
{
"category": "uRgpiamOVTEQ",
"list": [
{
"price": 29,
"name": "ehLYoPpntlil"
}
]
},
{
"category": "ozQNmdwpwhXPnabZ",
"list": [
{
"price": 96,
"name": "ITTaLHf"
},
{
"price": 88,
"name": "MXVgJFBgtwLYk"
}
]
},
{
"category": "EDkfKGZSou",
"list": [
{
"price": 86,
"name": "JluoCLnenOqDllaEX"
},
{
"price": 35,
"name": "HbmgMDfxCOk"
},
{
"price": 164,
"name": "BlrUD"
},
{
"price": 106,
"name": "LOUcsMDeaqVm"
},
{
"price": 14,
"name": "rDkwhN"
}
]
}
],
}

没有索引的搜索

> db.test1.find({"prices.list.price": { $gt: 190 } }).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 541098,
"nscannedObjects" : 1005584,
"nscanned" : 1005584,
"nscannedObjectsAllPlans" : 1005584,
"nscannedAllPlans" : 1005584,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 8115,
"nChunkSkips" : 0,
**"millis" : 13803,**
"server" : "localhost:27017",
"filterSet" : false
}

有索引:

> db.test1.ensureIndex({"prices.list.price":1,"menu.list.name":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}

> db.test1.find({"prices.list.price": { $gt: 190 } }).explain()
{
"cursor" : "BtreeCursor prices.list.price_1_prices.list.name_1",
"isMultiKey" : true,
"n" : 541098,
"nscannedObjects" : 541098,
"nscanned" : 868547,
"nscannedObjectsAllPlans" : 541098,
"nscannedAllPlans" : 868547,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 16852,
"nChunkSkips" : 0,
**"millis" : 66227,**
"indexBounds" : {
"menu.list.price" : [
[
190,
Infinity
]
],
"menu.list.name" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
},
"server" : "localhost:27017",
"filterSet" : false
}

知道为什么索引搜索比没有索引的搜索慢吗?

另外我会使用:

db.test1.find( { loc : { $near : [39.876045, 32.862245]}}) (需要二维索引)

db.test1.find({ keywords:{$in: [ "small", "another"] }}) (对关键字使用索引)

db.test1.find({"prices.list.name":/.s./})(不需要索引,因为我将使用正则表达式)

最佳答案

索引允许更快地访问满足查询的文档的位置。

在您的示例中,您的查询选择了集合中所有文档的一半。因此,尽管索引扫描可以更快地了解哪些文档将匹配查询谓词,但实际上它总体上会产生更多的工作。

在集合扫描中,查询扫描所有文档,并检查您查询的字段是否匹配。一半的时间它最终选择文档。

在索引扫描中,查询遍历所有索引条目的一半,然后从中直接跳转到满足查询谓词的文档。在您的情况下,这是更多的操作。

此外,在执行此操作时,当操作需要等待必须读取的文档被带入 RAM 时,或者当有写入等待进行时,操作会产生读取互斥量,并且索引扫描显示的产量数量是收集扫描的两倍。如果您的工作集没有足够的 RAM,那么添加索引会给现有资源带来更多压力,并使事情变得更慢,而不是更快。

尝试使用价格与更大的数字(例如 500)(或您的数据集中更具选择性的任何数字)进行比较的相同查询。如果使用索引的查询速度仍然较慢,那么您可能会在系统上看到很多页面错误。但是,如果索引有足够的 RAM,则索引查询将快很多,而未索引查询将同样慢。

关于mongodb - Mongodb - 索引变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24714967/

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