MongoDB - 如何提高创建索引的性能?

Posted

技术标签:

【中文标题】MongoDB - 如何提高创建索引的性能?【英文标题】:MongoDB - How to increase create index performance? 【发布时间】: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. 关于如何提高构建索引性能的任何其他想法?

谢谢!

【问题讨论】:

【参考方案1】:

如果您的版本低于 4.2,则此参数仅适用于前台进程。

从 4.2 开始,它将适用于所有索引构建。(前景和背景)。也许您可以检查您正在尝试的版本。

https://docs.mongodb.com/manual/reference/parameters/#param.maxIndexBuildMemoryUsageMegabytes

【讨论】:

以上是关于MongoDB - 如何提高创建索引的性能?的主要内容,如果未能解决你的问题,请参考以下文章

基于gt和lt创建mongodb索引

如何通过MongoDB自带的Explain功能提高检索性能?

不同类型的 MongoDB 索引

我如何使用视图和索引来提高性能

MSSQL之八 实现视图与索引

如何改善数据库的结构,以及如何使用索引来缩短搜索时间