有没有办法强制mongodb在ram中存储某些索引?

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)

gWa*_*ldo 5

不,MongoDB允许系统管理存储在RAM中的内容.

话虽如此,您应该能够通过定期运行对索引的查询(检查查询提示)来保持索引在RAM中,以防止它们变得陈旧.

有用的参考文献:

此外,Kristina Chodorow提供了关于MongoDB索引与RAM之间关系的优秀答案


更新:

提供.explain()输出的更新后,我看到以下内容:

  • 查询正在命中索引.
  • nscanned是检查的项目数(文档或索引条目).
  • nscannedObjects是扫描的文档数
  • n是与指定条件匹配的文档数
  • 您的数据集是300393个条目,它是索引中的项目总数以及匹配的结果.

我可能读错了,但我读到的是你收藏的所有物品都是有效的结果.在不知道您的数据的情况下,似乎每个项目都包含标签"avi".这意味着另一件事就是这个指数几乎没用; 当索引尽可能地缩小结果字段时,索引提供最大的价值.

来自MongoDB的" 索引建议和常见问题 "页面:

理解解释的输出.在检查explain命令的输出时,有三个主要的字段要查找:

  • cursor:cursor的值可以是BasicCursor或BtreeCursor.其中第二个表示给定查询正在使用索引.
  • nscanned:扫描的文档数量.
  • n:查询返回的文档数.您希望n的值接近nscanned的值.您要避免的是进行集合扫描,即访问集合中的每个文档.当nscanned等于集合中的文档数时,就是这种情况.
  • millis:完成查询所需的毫秒数.此值对于比较索引策略,索引查询与非索引查询等非常有用.