【发布时间】:2018-06-02 06:43:54
【问题描述】:
我正在寻找有关在 MongoDb 3.4 中使用哪种索引策略的建议。
假设我们有一个 people 文档集合,其形状如下:
{
_id: 10,
name: "Bob",
age: 32,
profession: "Hacker"
}
让我们假设一个用于查询集合的 web api 被公开,唯一可能的过滤器是 name 或 age。
对 api 的示例调用将类似于:http://myAwesomeWebSite/people?name="Bob"&age=25
这样的调用将在以下查询中翻译:db.people.find({name: "Bob", age: 25})。
为了更好地阐明我们的场景,请考虑:
- 字段 name 已经在我们的文档中,并且我们已经在该字段上建立了索引
- 由于我们的应用程序的一些新功能,我们将添加新字段 age
- 数据库只能通过上面提到的web api访问,最重要的要求是暴露一个超快速的web api
- 对 web api 的所有调用都将在字段名称和年龄上应用过滤器(换句话说,对 web api 的所有调用都将具有相同的模式,即如上所示)
也就是说,我们必须决定以下哪些索引提供最佳性能:
- 复合索引:
{name: 1, age: 1} - 两个单字段索引:
{name: 1}和{age: 1}
根据一些简单的测试,似乎单个复合索引比两个单字段索引性能要好得多。
通过 mongo shell 执行单个查询,explain() 方法表明使用单个复合索引可以比使用两个单字段索引快近十倍地查询数据库。
在更现实的情况下,这种差异似乎不那么明显,在这种情况下,不是通过 mongo shell 执行单个查询,而是对 nodejs Web 应用程序的两个不同 url 进行多次调用。两个 url 都对数据库执行查询并将获取的数据作为 json 数组返回,一个使用具有单个复合索引的集合,另一个使用具有两个单字段索引的集合(两个集合具有完全相同的文档)。 在本次测试中,单一复合指数在性能方面似乎仍然是最佳选择,但这次差异不那么明显。
根据测试结果,我们正在考虑使用单一复合指数法。
有没有人有这方面的经验?我们是否遗漏了任何重要的考虑因素(可能是大型复合索引的一些缺点)?
【问题讨论】:
标签: mongodb performance indexing mongodb-query