我有两个字段a和b,其中b的选择性比a高得多。
现在,如果我只查询a和b(从不单独查询任何一个字段),以下两个索引中哪个更好,为什么:
{a: 1, b : 1}
{b: 1, a : 1}
解释似乎返回几乎相同的结果,但我在某处读到您应该首先放置更高的选择性字段。我不知道为什么这会有意义。
我有两个字段a和b,其中b的选择性比a高得多。
现在,如果我只查询a和b(从不单独查询任何一个字段),以下两个索引中哪个更好,为什么:
{a: 1, b : 1}
{b: 1, a : 1}
解释似乎返回几乎相同的结果,但我在某处读到您应该首先放置更高的选择性字段。我不知道为什么这会有意义。
经过大量工作以改进对 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 条记录只需一秒钟即可匹配,而不是持续数小时。
希望这可以帮助某人
干杯
在做了一些进一步的分析之后,从性能的角度来看,这两个索引实际上几乎是相同的。
确实,如果您处于类似情况,真正的考虑应该是将来您是否更有可能单独查询a或b,并将该字段放在索引中的第一位。
我相信优化器会选择最适合使用的索引,尽管您可以提供提示
例如
db.collection.find({user:u, foo:d}).hint({user:1});