为什么指数此事方向在MongoDB中?为什么指数此事方向在MongoDB中?(Why does di

2019-05-12 22:15发布

引述文档 :

当创建一个索引,与键相关联的数字指定的索引的方向,所以它应始终为1(升序)或-1(降序)。 方向不要紧,单一关键指标或随机访问检索,但重要的是,如果你是在复合索引做排序或范围查询。

不过,我看不出为什么该指数的方向应该在复合索引关系。 可有人请提供进一步的解释(或一个例子)?

Answer 1:

MongoDB的串接以某种方式复合键,并使用它作为一个B树的关键。

当发现单品 -节点树的顺序是无关紧要的。

如果要返回一系列节点 -相互接近的元素会有所回落树的树枝一样。 越接近节点是在它们可被检索到的更快的范围内。

随着单场指数 -顺序并不重要。 如果他们是并拢按升序排列,他们也将接近在一起,按降序排列。

当你有一个复合键 -订单开始无关紧要。

例如,如果关键是升乙上升的指数可能是这个样子:

Row   A B
1     1 1
2     2 6
3     2 7 
4     3 4
5     3 5
6     3 6
7     5 1

一种用于升乙降查询需要围绕指数跳出为了回报行会慢一些。 例如,它会返回行1, 3, 2, 6, 5, 4, 7

以相同的顺序为索引一个远程查询只会按照正确的顺序返回行顺序。

发现在B树的记录需要O(日志(n))的时间。 为了找到的记录范围是仅OLog(N)+ k,其中k是记录返回的数量。

如果记录是无序,成本可能高达OLog(N)* K



Answer 2:

您正在寻找的答案简单当你在两个或多个字段排序方向唯一重要的

如果要排序的{a : 1, b : -1}

指数{a : 1, b : 1}大于索引 {a : 1, b : -1}



Answer 3:

为什么指数

了解两个关键点。

  1. 虽然指数比没有索引更好的,正确的索引是比任何好得多。
  2. MongoDB的将只能使用一个索引每个查询,使得复合索引与正确的字段排序你可能需要使用。

索引是不是免费的。 他们采取的内存,并处性能损失做插入,更新和删除时。 通常对性能的影响可以忽略不计(特别是相对于在读的性能提升),但是,这并不意味着我们不能聪明地创造我们的索引。

如何索引

确定什么组字段应该被索引在一起是为了了解您正在运行的查询。 用于创建索引的字段的顺序是至关重要的。 好消息是,如果你的顺序不对,该索引将不会被使用的话,那么这将是容易解释发现。

为什么排序

您的查询可能需要排序。 但排序可以是一个昂贵的操作,所以它来治疗,你是对的排序,就像您要查询的字段的字段是很重要的。 因此,这将是更快,如果它有指标。 有一个重要的区别虽然,要排序必须在索引中的最后一个字段的字段。 唯一的例外是,如果该领域也是你查询的一部分,那么必须待最后的规则并不适用。

如何排序

您可以指定索引或一个子集的所有键排序; 然而,排序关键字必须以相同的顺序列出,因为它们出现在索引中。 例如,一个索引关键字图案{一个:1,B:1}可以支持排序{一个:1,B:1}而不是在{B:1,一个:1}。

的排序必须指定其所有键作为索引关键字图案相同的排序方向(即上升/下降),或指定其所有键作为索引关键字图案相反的排序方向。 例如,一个索引关键字图案{一个:1,B:1}可以支持排序上{一个:1,B:1}和{A:-1,B:-1}而不是在{A:-1 ,b:1}。

假设有这些索引:

{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }

Example                                                    Index Used
db.data.find().sort( { a: 1 } )                            { a: 1 }
db.data.find().sort( { a: -1 } )                           { a: 1 }
db.data.find().sort( { a: 1, b: 1 } )                      { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } )                    { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } )                { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )   { a: 1, b: 1 }


文章来源: Why does direction of index matter in MongoDB?