基于场选择性的复合索引顺序

时间:2012-10-15 11:30:11

标签: mongodb mongodb-indexes

我有两个字段 a b ,其中 b 的选择性明显高于 a

现在,如果我只查询 a b (从不在任何一个字段上查询),以下两个索引中的哪个更好,为什么:< / p>

  1. {a: 1, b : 1}
  2. {b: 1, a : 1}
  3. 解释似乎返回几乎相同的结果,但我在某处读到你应该首先放置更高的选择性字段。我不知道为什么那会有意义。

3 个答案:

答案 0 :(得分:4)

经过一番广泛的工作来改进对150 000 000记录数据库的查询后,我发现了以下内容:

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

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

zip,地址,城市,名字,姓氏

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

地址字段实际上可能具有最高的选择性,但由于它没有与简单的字符串相等匹配,因此需要花费最多的时间。它实际上就是这样的

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

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

希望这有助于某人

欢呼声

答案 1 :(得分:1)

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

真的,如果你处于类似的情况,真正的考虑应该是将来你是否更有可能单独查询 a 或单独查询 b ,以及将该字段放在索引中。

答案 2 :(得分:0)

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

e.g。

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

请参阅http://www.mongodb.org/display/DOCS/Optimization

相关问题