Moo*_*ker 7 indexing ram caching mongodb nosql
我有一个相对较大的索引(但可用ram少)的集合,并查看此集合上的find的性能和我的系统中由htop给出的免费ram的数量,似乎mongo没有在ram中存储完整的索引.有没有办法强制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"
]
]
}
}
Run Code Online (Sandbox Code Playgroud)
并非所有对象都标有"avi"标记:
> db.barrels.find().explain()
{
"cursor" : "BasicCursor",
"nscanned" : 823299,
"nscannedObjects" : 823299,
"n" : 823299,
"millis" : 46270,
"indexBounds" : {
}
}
Run Code Online (Sandbox Code Playgroud)
没有"$ 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"
]
]
]
}
}
Run Code Online (Sandbox Code Playgroud)
当我搜索两个或更多标签时,它会发生这种情况(它会扫描每个项目,好像没有索引):
> db.barrels.find({"tags":{"$all": ["avi","mp3"]}}).explain()
{
"cursor" : "BtreeCursor tags_1",
"nscanned" : 300393,
"nscannedObjects" : 300393,
"n" : 6427,
"millis" : 53774,
"indexBounds" : {
"tags" : [
[
"avi",
"avi"
]
]
}
}
Run Code Online (Sandbox Code Playgroud)
不,MongoDB允许系统管理存储在RAM中的内容.
话虽如此,您应该能够通过定期运行对索引的查询(检查查询提示)来保持索引在RAM中,以防止它们变得陈旧.
有用的参考文献:
此外,Kristina Chodorow提供了关于MongoDB索引与RAM之间关系的优秀答案
更新:
提供.explain()输出的更新后,我看到以下内容:
我可能读错了,但我读到的是你收藏的所有物品都是有效的结果.在不知道您的数据的情况下,似乎每个项目都包含标签"avi".这意味着另一件事就是这个指数几乎没用; 当索引尽可能地缩小结果字段时,索引提供最大的价值.
来自MongoDB的" 索引建议和常见问题 "页面:
理解解释的输出.在检查explain命令的输出时,有三个主要的字段要查找:
- cursor:cursor的值可以是BasicCursor或BtreeCursor.其中第二个表示给定查询正在使用索引.
- nscanned:扫描的文档数量.
- n:查询返回的文档数.您希望n的值接近nscanned的值.您要避免的是进行集合扫描,即访问集合中的每个文档.当nscanned等于集合中的文档数时,就是这种情况.
- millis:完成查询所需的毫秒数.此值对于比较索引策略,索引查询与非索引查询等非常有用.
| 归档时间: |
|
| 查看次数: |
3364 次 |
| 最近记录: |