1

我有两个字段ab,其中b的选择性比a高得多。

现在,如果我只查询ab(从不单独查询任何一个字段),以下两个索引中哪个更好,为什么:

  1. {a: 1, b : 1}
  2. {b: 1, a : 1}

解释似乎返回几乎相同的结果,但我在某处读到您应该首先放置更高的选择性字段。我不知道为什么这会有意义。

4

3 回答 3

4

经过大量工作以改进对 150 000 000 条记录数据库的查询后,我发现了以下内容:

不一定是更高的选择性字段,但实际上匹配“更快”的字段,移动到第一个位置可以显着提高性能

我有一个由以下字段组成的索引:

邮编、地址、城市、名字、姓氏

地址由数组匹配,而不是 string = string,因此执行时间最长,匹配速度最慢。我创建的第一个索引是:address_zip_city_last_name_first_name,将 1000 条记录与整个数据库匹配的执行时间将持续数小时。

地址字段实际上可能对这些具有最高的选择性,但由于它不是通过简单的字符串相等来匹配,因此它花费的时间最多。它实际上是这样的

{ address: {$all : ["1233", "main", "avenue] }}

通过将此索引更改为在开头具有“更快”字段,例如:zip_city_first_name_last_name_address,性能会好得多。相同的 1000 条记录只需一秒钟即可匹配,而不是持续数小时。

希望这可以帮助某人

干杯

于 2015-02-16T00:16:26.223 回答
1

在做了一些进一步的分析之后,从性能的角度来看,这两个索引实际上几乎是相同的。

确实,如果您处于类似情况,真正的考虑应该是将来您是否更有可能单独查询ab,并将该字段放在索引中的第一位。

于 2012-10-20T15:23:46.570 回答
0

我相信优化器会选择最适合使用的索引,尽管您可以提供提示

例如

db.collection.find({user:u, foo:d}).hint({user:1});

http://www.mongodb.org/display/DOCS/Optimization

于 2012-10-15T18:33:33.817 回答