我有相当大的数据集——2TB 的文本数据,1800 万行。
每个文档都相同:5 个字段:4 个字符串 + 1 个整数。
所有字段都应该被索引和搜索。
即:3 个字符串标记的数组,1 个单独的字符串,1 个整数。
"t" : ["param","pam","tadam"],
"p" : "haha",
"f" : 3062632
我尝试了两种方法:
- 导入,然后创建索引
- 创建索引,然后导入
Mongo 日志被禁用,XFS,CentOS7.6,MongoDB 4.0.6 尝试了非常强大的服务器(72core,144GB RAM,6X SSD RAID)
- 速度在秒内超过百万次插入。插入后,不到一天的时间,我开始了前景索引。我已经设置了这个参数 maxIndexBuildMemoryUsageMegabytes=10000
命令是:
db.runCommand( { createIndexes: "records", indexes: [
{ key: { "f" : 1 }, name: "find" },
{ key: { "p" : 1 }, name: "pind" },
{ key: { "t" : 1 }, name: "tind" }
]
}
)
它适用得很好,因为 mongo 报告说“使用批量方法;构建可能暂时使用多达 3333 兆字节的 RAM”
速度很糟糕,硬件饱和度接近于零。1 个 CPU 核心,100% SSD,3%
- 如果我在插入之前创建索引,速度从 100k 插入开始,但在 200-300 百万个文档中快速下降到每秒数千条记录。
这个问题可以用 MongoDB 解决吗?还是另一个 DBMS?
一个洞穴:我需要一台服务器上的所有数据集,没有集群。
在 MongoDB JIRA 中已经为此创建了一个 OPEN 问题。
根据问题,MongoDB 索引创建不是多线程的。
使用多个核心进行索引排序阶段
多线程索引创建
更新
尝试增加
maxIndexBuildMemoryUsageMegabytes
参数值。默认值为 500 MB。
它有什么作用?
限制在一个集合上同时构建的前台索引在构建期间可能消耗的内存量。
所以通过增加这个限制,可能会提高索引创建的性能。例如: