蒙古三重化合物指数

如果你有一个双重复合索引{a:1,b:1},那么对于我而言,如果你单独在b上查询(即你不能在你的查询中“跳过”a),索引将不会被使用。 但是,如果您单独查询,索引将被使用。

但是,给定三元复合索引{a:1,b:1,c:1}我的解释命令显示,当您在a和c上查询时(例如,您可以在查询中“跳过”b)时使用索引。

Mongo如何在ac查询中使用abc索引,以及在这种情况下索引的有效性如何?

背景:

我的用例是,有时我想查询a,b,c,有时我想查询a,c。 现在我应该在a,b,c上只创建一个索引,还是应该在a,c和a,b,c上创建一个索引?

(在a,c,b上创建索引是没有意义的,因为c是一个具有良好选择性的多键索引。)


底线/ tl; dr:如果ac被查询为相等或不等,则索引b可以被“跳过”,但不是,例如,用于c排序。

这个问题问得好。 不幸的是,我找不到任何权威性的更详细的答案。 我相信这些查询的表现在过去几年中有所改善,所以我不会相信这个话题的旧材料。

整个事情非常复杂,因为它取决于索引的选择性以及是否查询相等,不平等和/或排序,因此explain()是您唯一的朋友,但以下是我发现的一些内容:

警告 :现在是混合了实验结果,推理和猜测。 我可能会把凯尔的比喻拉得太远,我甚至可能完全错误(并且不幸,因为我的测试结果与我的推理松散相符)。

很明显,可以使用A的指数,这取决于A的选择性,当然是非常有用的。 “跳过”B可能会非常棘手,或者不会。 让我们继续类似于Kyle的食谱示例:

French
    Beef
        ...
    Chicken
        Coq au Vin
        Roasted Chicken
    Lamb
        ...
    ...

如果你现在要求我找一些名为“Chateaubriand”的法国菜,我可以使用索引A ,因为我不知道这种成分,所以必须扫描A所有菜。 另一方面,我知道每个类别中的菜肴列表都是通过索引C排序的,所以我只需要在每个配料列表中查找以“Cha”开头的字符串。 如果有50种成分,我将需要50次查找,而不仅仅是1次,但这比扫描每道法式菜肴要好得多!

在我的实验中,数量比b中不同值的数量要小得多:它似乎从未超过2.但是,我仅用一个集合来测试它,它可能与b的选择性有关 -指数。

不过,如果您要求我给您一份按字母顺序排列的所有法式菜肴 ,我会遇到麻烦 。 现在C上的索引是毫无价值的,我不得不合并对所有这些索引列表进行排序。 我将不得不扫描每个元素来执行此操作。

这反映在我的测试中。 这里有一些简化的结果。 原始集合包含日期时间,整数和字符串,但我想简单一些,所以现在都是整数。

实质上,只有两类查询:那些nscanned <= 2 * limit ,以及那些必须扫描整个集合(120k文档)的。 索引是{a, b, c}

// fast (range query on c while skipping b)
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }});
// slow (sorting)
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }}).sort({ "c" : -1});
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }}).sort({ "b" : -1}); 

// fast (can sort on c if b included in the query)
> db.Test.find({"a" : 43, "b" : 7887, "c" : { $lte : 45454 }}).sort({ "c" : -1});

// fast (older tutorials claim this is slow)
> db.Test.find({"a" : {$gte : 43}, "c" : { $lte : 45454 }});

你的里程会有所不同。


您可以查看A和C上的查询,作为查询A的特例(在这种情况下,将使用索引)。 使用索引比加载整个文档更有效。

假设你想获得所有文档,其中A在7和13之间,C在5和8之间。

如果只有A的索引:数据库可以使用索引来选择A在7到13之间的文档,但为了确保C在5到8之间,它也必须检索相应的文档。

如果您在A,B和C上有索引:数据库可以使用索引来选择A在7和13之间的文档。由于C的值已经存储在索引的记录中,因此可以确定相应的文件也符合C标准,而不必检索这些文件。 因此,您将避免读取磁盘,并获得更好的性能。

链接地址: http://www.djcxy.com/p/57905.html

上一篇: Mongo Triple Compound Index

下一篇: I can't make rails generate controller