假设一个具有 3 个字段的假设文档:
- _id : 对象ID
- 电子邮件地址:字符串
- 帐户:字符串
现在,给定一个关于 emailAddress AND account 的查询,以下两个索引中哪个会执行得更好:
- emailAddress 上的唯一索引(假设它是唯一字段)
- account 和 emailAddress 的复合索引
假设一个具有 3 个字段的假设文档:
现在,给定一个关于 emailAddress AND account 的查询,以下两个索引中哪个会执行得更好:
在性能方面,差异充其量是很小的。由于您的电子邮件地址是唯一的,因此任何具有电子邮件字段的复合索引都不会比单独的电子邮件地址索引更有帮助。这样做的原因是您的电子邮件字段已经具有您的集合的最大基数,并且任何进一步的索引字段都不会帮助数据库更快地过滤记录,因为它总是会到达正确的文档,只有电子邮件字段。
在内存使用方面(这对于像 MongoDB 这样的数据库非常重要),单独的电子邮件索引也小得多。
TL;DR :仅使用电子邮件地址上的索引。
当谈到索引时,目标是创建一个具有最高可能基数(或“选择性”)的索引。尝试编写每个查询使用 1 个(复合)索引的查询。唯一索引具有最大基数。将具有较少选择性字段的唯一索引复合不能进一步增加该最大值。添加更多索引只会减慢 find()、update() 和 remove() 查询的速度。所以要“精益求精”。
但是,如果您在 account 字段上使用 sort(),同时在 email 字段上执行 find(),那么您应该使用复合索引:
查询多个键并对结果进行排序是很常见的。对于这些情况,复合索引是最好的。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ
所以三思而后行!如果您需要按另一个字段对数据进行排序,那么您通常需要一个复合索引。