2012-03-07 72 views
7

假设一个假设的文件有3个字段:MongoDB的 - 唯一索引VS复合索引

  1. _id:OBJECTID
  2. EMAILADDRESS:字符串
  3. 帐户:字符串

现在,给定一个查询在emailAddress和帐户上,以下两个索引中的哪一个将表现得更好:

  1. 上EMAILADDRESS单独唯一索引(假设它是一个独特的领域)
  2. 复合指数账号和EMAILADDRESS

回答

14

在性能上的差异将是小充其量条款。由于您的电子邮件地址是唯一的,所以具有电子邮件字段的任何复合索引都不会比单独使用电子邮件地址索引更有帮助。原因是您的电子邮件字段已经具有您的收藏夹的最大基数,并且任何进一步的索引字段都不会帮助数据库更快地过滤记录,因为它将始终仅通过电子邮件字段到达正确的文档。

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

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

+0

这也是我一直在倾向的方向,空间考虑通常意味着电子邮件索引本身就是正确的决定。这就是为什么我已经提高了它。然而,在你的回答中,我并没有看到一个令人信服的证据,表明在平均情况下,这两种方案哪一种表现更好。 – 2012-03-07 11:29:50

+2

那应该很容易扣除。如果索引A(仅限电子邮件)与索引B(化合物)完全相同的B树遍历,则不存在复合索引可能更快的情况。 – 2012-03-07 11:53:48

3

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

然而,如果您正在使用的帐户字段排序(),而在电子邮件领域做一个find()方法,那么你应该使用一个复合索引:

很常见,用来查询多个键和排序 结果。对于这些情况,复合指标是最好的。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ

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