【发布时间】:2012-03-28 16:40:01
【问题描述】:
我有一个索引相对较大的集合(但小于可用的 ram),并查看这个集合中 find 的性能以及 htop 给出的我的系统中的可用 ram 数量,似乎 mongo 没有将完整索引存储在内存。有没有办法强制 mongo 将此特定索引存储在 ram 中?
查询示例:
> db.barrels.find({"tags":{"$all": ["avi"]}}).explain()
{
"cursor" : "BtreeCursor tags_1",
"nscanned" : 300393,
"nscannedObjects" : 300393,
"n" : 300393,
"millis" : 55299,
"indexBounds" : {
"tags" : [
[
"avi",
"avi"
]
]
}
}
并非所有对象都被标记为“avi”标签:
> db.barrels.find().explain()
{
"cursor" : "BasicCursor",
"nscanned" : 823299,
"nscannedObjects" : 823299,
"n" : 823299,
"millis" : 46270,
"indexBounds" : {
}
}
没有“$all”:
db.barrels.find({"tags": ["avi"]}).explain()
{
"cursor" : "BtreeCursor tags_1 multi",
"nscanned" : 300393,
"nscannedObjects" : 300393,
"n" : 0,
"millis" : 43440,
"indexBounds" : {
"tags" : [
[
"avi",
"avi"
],
[
[
"avi"
],
[
"avi"
]
]
]
}
}
当我搜索两个或更多标签时也会发生这种情况(它扫描每个项目,就好像没有索引一样):
> db.barrels.find({"tags":{"$all": ["avi","mp3"]}}).explain()
{
"cursor" : "BtreeCursor tags_1",
"nscanned" : 300393,
"nscannedObjects" : 300393,
"n" : 6427,
"millis" : 53774,
"indexBounds" : {
"tags" : [
[
"avi",
"avi"
]
]
}
}
【问题讨论】:
-
您是否尝试过在您的查询中运行“解释”以了解为什么它很慢?
-
@gWaldo 添加了示例查询,但查看它我没有发现任何线索。
-
我将更新与此信息相关的答案。
标签: mongodb caching indexing ram nosql