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

2024-01-03

我有一个具有相对较大索引的集合(但小于可用内存),并查看该集合上 find 的性能以及 htop 给出的系统中的可用内存量,似乎 mongo 没有在内存中存储完整索引。有没有办法强制 mongo 将这个特定索引存储在内存中?

查询示例:

> 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"
                        ]
                ]
        }
}

不会。MongoDB 允许系统管理 RAM 中存储的内容。

话虽如此,您应该能够通过对索引运行查询来将索引保留在 RAM 中(查看查询提示 http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint)定期防止它们变得陈旧。

有用的参考资料:

  • 检查服务器内存使用情况 http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage

  • 索引建议和常见问题解答 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ

此外,克里斯蒂娜·乔多罗 (Kristina Chodorow) 还提供了这一点关于 MongoDB 索引和 RAM 之间关系的优秀答案 https://stackoverflow.com/a/2815095/428779


UPDATE:

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

  • 查询正在命中索引。
  • nscanned 是检查的项目(文档或索引条目)的数量。
  • 扫描的对象是扫描的文档数量
  • n 是符合指定条件的文档数量
  • 您的数据集有 300393 个条目,这是索引中的条目总数以及匹配结果。

我可能读错了,但我读的是您集合中的所有项目都是有效结果。在不知道您的数据的情况下,似乎每个项目都包含标签“avi”。这意味着该索引几乎毫无用处。当索引尽可能缩小结果字段时,它们会提供最大的价值。

来自 MongoDB 的“索引建议和常见问题解答 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-Understanding%7B%7Bexplain%7D%7D%27soutput." page:

理解解释的输出。主要看三个领域 检查解释命令的输出时:

  • 光标:光标的值可以是 BasicCursor 或 BtreeCursor。 其中第二个指示给定查询正在使用索引。
  • nscanned:扫描的文档数。
  • n:文档数量 由查询返回。您希望 n 的值接近 nscanned 的值。你想要避免的是进行集合扫描, 也就是说,访问集合中的每个文档的位置。这是 当 nscanned 等于文件中的文档数时的情况 收藏。
  • millis:完成该操作所需的毫秒数 询问。该值对于比较索引策略、索引 与非索引查询等
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法强制 mongodb 将某些索引存储在 ram 中? 的相关文章

  • 在 config.js 中打开 admin 以查看服务器统计信息

    拉动后运行此命令 docker run d p 27017 27017 e MONGO INITDB ROOT USERNAME admin e MONGO INITDB ROOT PASSWORD password name mongod
  • 如何在图数据库(如 Neo4j)中对现实世界的关系进行建模?

    我有一个关于在图形数据库中建模的一般性问题 但我似乎无法解决这个问题 您如何建模这种类型的关系 牛顿发明了微积分 In a 简单图 http docs neo4j org chunked snapshot graphdb neo4j rel
  • mongo docker 镜像创建后未运行脚本

    我使用 docker compose 为前端 后端和 mongo 实例创建 3 个不同的容器 其中三个正在运行并在它们之间连接 但我需要在 mongo 实例运行后立即在数据库上创建一个管理员用户 根据 mongo 图像文档 每个脚本位于do
  • 创建永远不匹配的 mongo 表达式的最佳方法

    我正在寻找的内容在某种程度上相当于在 SQL 中执行的操作 WHERE 1 0 我正在寻找这样的东西 因为我正在构建一个类型安全的 DSL 来在我的域上执行查询 支持连接和析取 有时 添加一个从不匹配任何内容的查询可能比在代码中处理它更容易
  • Numpy 花哨的索引和分配

    通常 numpy 会强制分配的左侧和右侧匹配 例如如果我这样做a b b必须是相同的形状或广播到相同的形状a 但该规则似乎有一个例外 gt gt gt a np arange 10 gt gt gt a array 0 1 2 3 4 5
  • 为任何更新查询增加 Mongoose 文档版本的简单方法?

    我想开始利用 Mongooses 文档版本控制 v key 我在实际增加版本值时遇到了问题 然后我发现您必须添加this increment 执行查询时 有没有办法自动递增 目前 我只是将其添加到pre用于更新类型查询的中间件 module
  • MongoDB 将数字转换为科学计数法的字符串

    我想获得完整的号码String 但反而 1490650000000 它返回科学计数法 1 49065e 12 这是我尝试转换它的方法 substr myNumber 0 1 有什么想法如何预防吗 Note 我使用的是v3 6 无法升级使用
  • MongoDB的ObjectId是如何生成的?

    他们是吗somewhat随机的 我的意思是 人们能够将它们分开吗 它们不是随机的 可以很容易地预测 BSON ObjectID 是一个 12 字节值 由 4 字节时间戳组成 自纪元以来的秒数 一个 3 字节 机器 ID 2 字节进程 ID
  • 索引匹配不起作用

    对于下表 如果 A 列和 B 列都匹配 如何检索 C 列A 列 B 列 C 列城市 1 城市 10 本地城市 2 城市 21 远程城市 3 城市 1 远程城市 4 城市 2 本地 我尝试使用索引和匹配 但得到 N A Enter as an
  • 多文档事务在使用 mongodb 4.08 社区服务器的 C# 中不起作用

    我需要使用 mongodb 事务更新多个文档 mongodb 社区服务器版本是 4 08 net 的 mongodb 驱动程序是 2 9 beta 也尝试过 2 8 从调试中 我可以看到它执行了 session AbortTransacti
  • Flask 不加载配置

    我在 Flask 中加载配置时遇到问题 from config import config DevelopmentConfig TestingConfig ProductionConfig def create app config nam
  • 我可以在 ASP.NET MVC 中使用 [CompressFilter] 而不破坏甜甜圈缓存吗

    我正在努力获得 压缩过滤器 http www thegrubbsian com p 202 使用甜甜圈缓存并遇到问题 发生的情况是整个页面都被缓存 而不仅仅是甜甜圈 的来源CompressFilter我正在使用的是下面的 我从原始来源 ht
  • mongoengine 操作的原子性如何

    我正在尝试在对象的状态之间转换 如下所示 User objects id user id state STATE WAITING update one set state STATE FINISHED The question是 是否存在这
  • mongo BadValue 未知运算符:$or

    该集合有一份文档 id ObjectId 54b513933aca242d9915a787 carriers carrier ObjectId 54b54d223aca242d9915a788 carryingInterval from I
  • 阻止 Mongoose 为子文档数组项创建 _id 属性

    如果您有子文档数组 Mongoose 会自动为每个子文档创建 id 例子 id mainId subDocArray id unwantedId field value id unwantedId field value 有没有办法告诉 M
  • MongoDB insertMany 并跳过重复项

    我试图insertMany https docs mongodb com manual reference method db collection insertMany 项目进入我的 Mongo 数据库 但我想跳过重复的 ID 我在用着N
  • 获取 pandas 数据框中每列的前 k 个元素的索引的快速方法

    我有一个非常大的 pandas 数据框 大约有 500 000 列 每列大约有 500 个元素长 对于每一列 我需要检索该列中前 k 个元素的 索引 列 位置 所以 如果 k 等于 2 这是我的数据框 A B C D w 4 8 10 2
  • 相同的单词但不同的 unicode 字符

    我在 Windows 上使用 Python 构建了一个关于越南餐馆的问答应用程序 要编写越南语字符 我需要使用 Unicode 首先 我从使用 HTML charset utf 8 的 TripAdvisor 网站克隆数据并构建我的 Mon
  • $unwind聚合框架中的对象

    在 MongoDB 聚合框架中 我希望在对象 即 JSON 集合 上使用 unwind 运算符 看起来不像是这样possible http docs mongodb org manual reference aggregation S un
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese

随机推荐