MongoDB - 唯一索引与复合索引

Posted

技术标签:

【中文标题】MongoDB - 唯一索引与复合索引【英文标题】:MongoDB - Unique index vs compound index 【发布时间】:2012-03-24 19:30:36 【问题描述】:

假设一个包含 3 个字段的假设文档:

    _id : ObjectId 电子邮件地址:字符串 帐户:字符串

现在,给定一个关于 emailAddress AND account 的查询,以下两个索引中哪个会执行得更好:

    仅 emailAddress 上的唯一索引(假设它是唯一字段) 帐户和电子邮件地址的复合索引

【问题讨论】:

【参考方案1】:

就性能而言,差异充其量只是很小。由于您的电子邮件地址是唯一的,因此任何具有电子邮件字段的复合索引都不会比单独的电子邮件地址索引更有帮助。这样做的原因是您的电子邮件字段已经具有您的集合的最大基数,并且任何进一步的索引字段都不会帮助数据库更快地过滤记录,因为它总是会到达正确的文档,只有电子邮件字段。

就内存使用而言(这对于 MongoDB 等数据库非常重要),单独的电子邮件索引也小得多。

TL;DR : 仅使用电子邮件地址的索引。

【讨论】:

这也是我一直倾向于的方向,空间考虑通常意味着单独的电子邮件索引是正确的决定。这就是为什么我赞成它。但是,在您的回答中,我没有看到令人信服的证据证明这两个选项中的哪一个在平均情况下表现更好。 嗯,这应该很容易扣除。如果索引 A(仅限电子邮件)与索引 B(复合)进行完全相同的 b 树遍历,则复合索引不可能更快。【参考方案2】:

对于索引,目标是创建一个具有最高可能基数(或“选择性”)的索引。尝试编写每个查询使用 1 个(复合)索引的查询。唯一索引具有最大基数。将具有较少选择性字段的唯一索引复合不能进一步增加该最大值。添加更多索引只会减慢 find()、update() 和 remove() 查询的速度。所以要“精益求精”。

但是,如果您在 account 字段上使用 sort(),同时在 email 字段上执行 find(),那么您应该使用复合索引:

查询多个键并对它们进行排序是很常见的 结果。对于这些情况,复合索引是最好的。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ

所以想清楚吧!如果您需要按另一个字段对数据进行排序,那么您通常需要一个复合索引。

【讨论】:

以上是关于MongoDB - 唯一索引与复合索引的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 索引唯一性约束

MongoDB中唯一索引的优势

自定义 MongoDB 对象 _id 与复合索引

MongoDB——索引属性之唯一索引(Unique Indexes)

MongoDB——索引属性之唯一索引(Unique Indexes)

MongoDB的索引操作