MongoDB大型索引构建非常慢

2024-03-23

我收藏了 4 亿份文档。每个字段都有 6 个日期时间字段、1 个布尔字段、8 个双精度字段、9 个整数字段和 6 个字符串字段。我正在尝试建立以下索引:

db.MyCollection.ensureIndex( 
    { "String1" : 1, "String2" : 1, "String3" : 1, "DateTime1" : 1, "Integer1" : 1, "DateTime2" : 1 }, 
    {background: true} 
);

运行了5天,只完成了一半。

该服务器运行 Windows Server Enterprise,拥有 4TB 磁盘空间和 256GB RAM。很少有其他进程针对数据库运行。没有分片或其他特殊配置。

有什么办法可以加快这个速度吗? (在不删除background = true限定符,因为我不希望它完全将我排除在数据库之外,在这种情况下它就是这样做的。)


误解

Speed

即使不谈论多键索引,也会发生以下情况。正在进行大规模的表扫描。因此 mongoDB 迭代文档,尝试找到要索引的字段,评估该字段(以null如果当前文档中不存在)并将其结果写入不少于 6 个文件,因为我们正在讨论 6 个索引。计算一下:200.000.000 / 86400 * 5 告诉我们 mongoDB 执行此操作的时间大约为每秒 460 个文档或者只需要每个文档 2.2 毫秒。我不会说那么慢。可能需要很长时间,但并不慢。

{background:true}

使用此参数可以not将您锁定在数据库之外。恰恰相反,文档中明确指出了这一点索引创建部分 http://docs.mongodb.org/manual/core/index-creation/#index-creation-background并在有关在后台创建索引的教程部分 http://docs.mongodb.org/manual/tutorial/build-indexes-in-the-background。不过,有一句话很容易被误解:

此外,在前台索引构建期间不能发生需要对所有数据库(例如 listDatabases)进行读或写锁定的操作。

这意味着您不能执行适用于所有数据库的操作and需要读或写锁。

改进方法(未来)

分片集群

使用具有副本集分片的共享集群。它易于设置,除了提高性能外,还具有多种优点。其中之一是添加分片(从而为集群添加空间和计算能力)的轻松可扩展性very简单的。备份对应用程序的影响较小。不再存在单点故障(如果做得正确,这甚至适用于整个数据中心规模的中断)。

使用不同的文件系统

抱歉,在 Windows Server 上运行依赖于磁盘 io 性能的应用程序对我来说根本没有意义。 ExtFS4 或 XFS 比 NTFS 或 ReFS 快 25% 到 40%,具体取决于优化情况。这使得real像您的用例一样依赖于磁盘 IO 的应用程序的差异。我们谈论的是几天的事情(甚至没有考虑 Linux 系统上操作系统更有效的内存映射和减少的内存消耗)。

{background:true}

虽然这并没有真正提高性能(实际上,出于明显的原因,在后台构建索引比在前台花费更长的时间),但您的应用程序在构建索引期间保持可用。因此,根据您的需求,这可能是一个可行的选择。

边注: 它是一个坏主意™,在使用 mongoDB 时垂直缩放,因为它被明确设计为水平缩放。这尤其适用于像您这样的大型集合,因为并行处理将极大地提高应用程序的性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB大型索引构建非常慢 的相关文章

  • 如何使用 node.js / mongodb 在 HTML 中显示任意、无模式数据

    我使用 mongodb 将应用程序错误日志存储为 json 文档 我希望能够将错误日志格式化为 HTML 而不是将纯 json 返回到浏览器 日志是完全无模式的 它们可以随时更改 因此尝试执行此操作 在 Jade 中 是没有用的 var i
  • Leiningen 在构建可用的 uberjar 时遇到问题

    我们正在尝试与 Leiningen 一起构建我们的 Clojure 项目 我们通过执行以下操作成功创建了 uberjar 前提条件 project clj 文件列出了依赖项 main my project core在项目 clj中 core
  • $lookup结果中的$match

    我有下一个蒙戈代码 db users aggregate match and UserName eq administrator Company CompanyName eq test lookup from companies local
  • HTML5 Canvas 性能:加载图像与绘图

    我正计划使用 javascript canvas 编写一个游戏 我只有一个问题 在加载图像与仅使用 canvas 的方法进行绘图方面 我应该考虑什么样的性能考虑因素 因为我的游戏将使用非常简单的几何图形 圆形 正方形 直线 所以任何一种方法
  • MongoDB 和 Mongoose 访问一个数据库,同时针对另一个数据库进行身份验证(NodeJS、Mongoose)

    我有几个数据库 不想为每个数据库创建单独的用户帐户 MongoDB 支持使用另一个数据库中定义的帐户来验证对数据库的访问的概念 但语法示例很难获得 当我终于弄清楚时 我正准备提出一个问题 如果它对其他人有帮助 就放在这里 这是 mongod
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • 当字段不为空时创建部分索引

    我正在尝试在字段上创建部分索引 但仅当该字段不为空时 换句话说 我希望能够让许多文档能够存储 null 但对于在字段中实际具有值的文档 我希望该值是唯一的 这是我尝试使用的代码 db account createIndex email 1
  • Emacs 行编号性能

    我试过了linum and nlinum 两者对于超过 100k 行的文件的性能都很糟糕 for x in 1 100000 do echo x done gt 100k txt emacs q 100k txt M x load libr
  • 嵌入文档中的mongodb限制

    我需要创建一个消息系统 一个人可以在其中与许多用户进行对话 例如 我开始与 user2 user3 和 user4 交谈 因此他们中的任何人都可以看到整个对话 并且如果对话在任何时候都不是私密的 则任何参与者都可以将任何其他人添加到对话中
  • Spring Data MongoDB 和批量更新

    我正在使用 Spring Data MongoDB 并且想要执行批量更新 就像此处描述的那样 http docs mongodb org manual reference method Bulk find update Bulk find
  • 更新插入 MongoDB 时如何防止出现“_t”字段?

    我有一个应用程序 它使用 MongoDB 的 C 驱动程序将 Upsert 插入 MongoDB 数据库 当我打电话给Update函数 我无法指定我要更新的类型 然后 t字段插入元素的类型 这是我用来更新插入的代码 collection U
  • 什么是“制定目标”?

    为什么我需要制作一个make target在能够构建我的源代码之前 更具体地说 什么是制定目标 http publib boulder ibm com infocenter rsdvhelp v6r0m1 index jsp topic o
  • 存储 PHP 数组的首选方法(json_encode 与序列化)

    我需要将多维关联数据数组存储在平面文件中以进行缓存 我偶尔可能会遇到需要将其转换为 JSON 以便在我的 Web 应用程序中使用的情况 但绝大多数时候我会直接在 PHP 中使用该数组 在此文本文件中将数组存储为 JSON 或 PHP 序列化
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 元素数组中数组的 MongoDB 全文

    当元素数组中的数组包含应与我的搜索匹配的文本时 我无法检索文档 以下是两个示例文档 id foo name Thing1 data text X X name Thing2 data text X Y id foo
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 颠覆和混合修订:破坏构建的秘诀?

    在使用 TFS 一段时间后 我刚刚回到 subversion 一般来说我已经很退出了 有一件事情我记得不一样 我不记得能够从过时的工作副本中提交 或者也许我的记忆力让我无法理解 过时 的定义 我认为 过时 意味着自从我上次更新工作副本以来
  • Mongoose 查找 array.length 大于 0 的所有文档并对数据进行排序

    我正在使用 mongoose 对 MongoDB 执行 CRUD 操作 这就是我的架构的样子 var EmployeeSchema new Schema name String description type String default
  • MongoDB - 打开和关闭连接 - 建议良好实践

    我通过 Node js 的驱动程序使用 MongoDB 我通常打开一个连接 通过connect 方法 任何时候我需要执行操作并关闭它 通过close 方法 一旦我完成 在我的程序中 我自然需要对 MongoDB 执行许多操作 因此我会多次打
  • 对带有空白 NVARCHAR 或 NULL 检查的 VARCHAR 索引进行 Count(*) 会导致返回的行数加倍

    我有一张桌子 上面有VARCHAR列及其上的索引 每当一个SELECT COUNT 是在这张表上完成的 该表检查了COLUMN N OR COLUMN IS NULL它返回双倍的行数 SELECT 与相同的where子句将返回正确的记录数

随机推荐