假设一个假设文档有3个字段:
- _id:ObjectId
- 电子邮件地址:字符串
- 帐户:字符串
现在,假设对emailAddress AND帐户进行查询,以下两个索引中的哪一个性能更好:
- 仅电子邮件地址上的唯一索引(假设它是一个唯一字段)
- 帐户和电子邮件地址的复合索引
就性能而言,差异充其量也很小。由于您的电子邮件地址是唯一的,任何包含电子邮件字段的复合索引都不会比单独使用电子邮件地址索引更有帮助。原因是您的电子邮件字段对于您的集合已经具有最大基数,任何进一步的索引字段都不会帮助数据库更快地筛选记录,因为它总是只通过电子邮件字段到达正确的文档。
就内存使用而言(这对MongoDB等数据库非常重要),仅电子邮件索引就要小得多。
TL;DR:仅使用电子邮件地址索引。
当涉及到索引时,目标是创建一个具有最高基数(或"选择性")的单个索引。尝试编写每个查询使用1(复合)索引的查询。唯一索引具有最大基数。将唯一索引与选择性较低的字段组合不会进一步增加该最大值。添加更多的索引只会减慢find()、update()和remove()查询的速度。所以要"瘦而吝啬"。
但是,如果您在帐户字段上使用sort(),而在电子邮件字段上使用find(),那么您应该使用复合索引:
查询多个键并对后果对于这些情况,复合索引是最好的。http://www.mongodb.org/display/DOCS/Indexing+建议+和+常见问题
好好想想吧!如果需要按另一个字段对数据进行排序,那么通常需要一个复合索引。