MongoDB - 独立索引 vs 复合索引

9
假设有一个包含 3 个字段的虚拟文档:
  1. _id:ObjectId
  2. emailAddress:字符串
  3. account:字符串
现在,给定一组基于 emailAddress 和 account 的查询条件,以下两个索引哪个性能更好:
  1. 仅基于 emailAddress 的唯一索引(假设它是唯一字段)
  2. 基于 account 和 emailAddress 的复合索引
2个回答

18
就性能而言,最多只有微小的差别。由于您的电子邮件地址是唯一的,任何包含电子邮件字段的复合索引都不会比仅针对电子邮件地址建立索引更有帮助。原因是您的电子邮件字段已经具有集合的最大基数,任何进一步的索引字段都无法帮助数据库更快地筛选记录,因为它始终只使用电子邮件字段即可抵达正确的文档。
在记忆使用方面(这对于像MongoDB这样的数据库非常重要),仅有电子邮件索引所需要的内存也较小。
简而言之:仅使用电子邮件地址上的索引。

这也是我一直倾向的方向,而空间考虑通常意味着仅电子邮件索引是正确的决定。这就是为什么我投了赞成票。然而,在你的答案中,我没有看到哪个选项在平均情况下表现更好的有说服力的证据。 - Zaid Masud
2
那应该很容易推断出来。如果索引A(仅限电子邮件)与索引B(复合索引)进行完全相同的B树遍历,那么在任何情况下,复合索引都不可能更快。 - Remon van Vliet

4
当涉及到索引时,目标是创建具有最高基数(或“选择性”)的单个索引。尝试编写每个查询使用1个(复合)索引的查询。唯一索引具有最大的基数。将不太具有选择性的字段与复合唯一索引结合使用无法进一步增加该最大值。添加更多索引只会减慢find()、update()和remove()查询。所以要“精益求精”。
然而,如果您在email字段上进行find()操作,同时在account字段上进行sort()操作,则应使用复合索引:
常见的情况是在多个键上查询并对结果进行排序。对于这些情况,最好使用复合索引。
因此,请仔细考虑!如果您需要按另一个字段对数据进行排序,则通常需要使用复合索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接