引述文档 :
当创建一个索引,与键相关联的数字指定的索引的方向,所以它应始终为1(升序)或-1(降序)。 方向不要紧,单一关键指标或随机访问检索,但重要的是,如果你是在复合索引做排序或范围查询。
不过,我看不出为什么该指数的方向应该在复合索引关系。 可有人请提供进一步的解释(或一个例子)?
引述文档 :
当创建一个索引,与键相关联的数字指定的索引的方向,所以它应始终为1(升序)或-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
您正在寻找的答案很简单 , 当你在两个或多个字段排序方向唯一重要的 。
如果要排序的{a : 1, b : -1}
指数{a : 1, b : 1}
将大于索引慢 {a : 1, b : -1}
了解两个关键点。
索引是不是免费的。 他们采取的内存,并处性能损失做插入,更新和删除时。 通常对性能的影响可以忽略不计(特别是相对于在读的性能提升),但是,这并不意味着我们不能聪明地创造我们的索引。
确定什么组字段应该被索引在一起是为了了解您正在运行的查询。 用于创建索引的字段的顺序是至关重要的。 好消息是,如果你的顺序不对,该索引将不会被使用的话,那么这将是容易解释发现。
您的查询可能需要排序。 但排序可以是一个昂贵的操作,所以它来治疗,你是对的排序,就像您要查询的字段的字段是很重要的。 因此,这将是更快,如果它有指标。 有一个重要的区别虽然,要排序必须在索引中的最后一个字段的字段。 唯一的例外是,如果该领域也是你查询的一部分,那么必须待最后的规则并不适用。
您可以指定索引或一个子集的所有键排序; 然而,排序关键字必须以相同的顺序列出,因为它们出现在索引中。 例如,一个索引关键字图案{一个: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 }