【发布时间】:2020-06-22 23:53:38
【问题描述】:
我做了一些测试来在 MongoDB 上创建索引。我的目标是了解如何缩短构建索引时间。我正在考虑更改 "maxIndexBuildMemoryUsageMegabytes" 值以允许 mongod 使用更多 RAM 来构建索引。
https://docs.mongodb.com/manual/reference/parameters/#param.maxIndexBuildMemoryUsageMegabytes
我做了以下测试,得到了一些有趣的结果:
测试#1
虚拟机内存:2GB
文档大小:1 亿个文档(7.7 GB 数据大小)
maxIndexBuildMemoryUsageMegabytes:500 MB
构建索引耗时 2269 秒。
测试 #2
将 maxIndexBuildMemoryUsageMegabytes 更改为 800 MB
建立索引花费了 1865 秒。
这是我所期望的。
测试 #3
将文档大小增加到 1.5 亿(11.642 GB db 大小)
maxIndexBuildMemoryUsageMegabytes:500 MB
耗时 6085(1.69 小时)构建索引
测试 #4
与测试 #3 相同,但将 maxIndexBuildMemoryUsageMegabytes 更改为 800 MB
构建索引花费了 26315(7.3 小时)。
这不是我所期望的。建立索引后,使用的交换空间为 477 MB。
然后我尝试在另一个 VM 上使用更多内存和更大的文档大小。
测试 #5
虚拟机内存:4GB
文档大小:2 亿个文档(15 GB 数据大小)
maxIndexBuildMemoryUsageMegabytes:500 MB
构建索引耗时 15032 秒。
测试 #6
与测试 #5 相同,但将 maxIndexBuildMemoryUsageMegabytes 更改为 1 GB。
建立索引花费了 15053 秒。
它并没有缩短构建索引时间。
然后我将文档大小增加到 4 亿个文档(37 GB 数据大小)。
我在 maxIndexBuildMemoryUsageMegabytes 值上尝试了 500 MB 和 1 GB。
构建索引时间完全相同。
我的问题是:
1. maxIndexBuildMemoryUsageMegabytes 应该设置什么?我知道这取决于内存大小与数据大小和其他因素。
我可以在构建索引时最大化内存使用率但不陷入使用交换的良好比率是多少? (swappiness 已经设置为 1)。
2. 关于如何提高构建索引性能的任何其他想法?
谢谢!
【问题讨论】:
标签: mongodb performance indexing