我有两个字段 a 和 b ,其中 b 的选择性明显高于 a 。
现在,如果我只查询 a 和 b (从不在任何一个字段上查询),以下两个索引中的哪个更好,为什么:< / p>
{a: 1, b : 1}
{b: 1, a : 1}
解释似乎返回几乎相同的结果,但我在某处读到你应该首先放置更高的选择性字段。我不知道为什么那会有意义。
答案 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});