有人说对于复合索引,然后排序很重要。有人说订购无关紧要。
哪一个是对的?为什么?
我的意思是,如果我查看电话,我根本看不出电话是如何排序的。复合索引将如何变化?
注意:我的意思是降序或升序。我很清楚列的顺序很重要。
请注意,我们有 2 个高分成员的答案。有人说,即使对于复合索引,降序或升序也无关紧要。另一个说这很重要。所以是的,这里有争议。我(或我们)在哪里可以挖掘更多。
在一般情况下订购确实很重要。问题是:您指的是什么顺序,这对您的情况有影响吗?
下降与上升。仅在您实际上希望以特殊顺序对结果进行排序的非常特殊的情况下才有意义。假设您希望您的结果如下所示:
a 升序,b 降序,c 升序
但你的指数是
a asc, b asc, c asc
数据库必须进行额外的排序。当您想根据某种顺序访问前 n 个元素时,这同样适用。这对于组合索引更为重要,因为单列方向的改变会导致完全不同的总排序,而单列索引中单列的排序只是颠倒了排序。
列的排序,所以
甲,乙,丙
对比
b, a, c
如果您过滤所有列并没有太大区别,但如果您只过滤 a,第一个索引将比第二个索引更有用。
每当您有两个选项可以解决编程语言中的问题并且有人告诉您它们没有任何作用时,请询问为什么存在这两个选项。如果“某人”不能回答这个问题,我不会相信他关于两者等同的建议。
我认为混淆是基于“排序”的两种不同含义。
正如您提到的,第一个无关紧要。不过,第二个确实很重要。
假设您有两个字段,名称和姓氏。(name, surname) 上的复合索引与 (surname, name) 上的复合索引不同。搜索将从第一列开始,然后是第二列。因此,如果您使用 surname 进行搜索,则 (name, surname) 上的复合索引将比 (surname, name) 上的复合索引慢。
例如,在字段 a 上为集合记录创建升序索引:
db.records.createIndex( { a: 1 } )
该索引可以支持升序排序a
,也可以a
通过逆序遍历索引来支持降序排序:
db.records.find().sort( { a: 1 } )
db.records.find().sort( { a: -1 } )
您对手机的看法是正确的,因为默认情况下搜索结果是按https://docs.mongodb.com/manual/reference/method/cursor.sort/#return-in-natural-order
$natural
排序的
对于复合索引,排序很重要。例如,索引键模式{ a: 1, b: 1 }
可以支持排序 on{ a: 1, b: 1 }
但不支持on { b: 1, a: 1 }
。
对于使用复合索引进行排序的查询,cursor.sort() 文档中所有键的指定排序方向必须与索引键模式匹配或与索引键模式的逆向匹配。例如,索引键模式{ a: 1, b: -1 }
可以支持排序 on { a: 1, b: -1 }
and{ a: -1, b: 1 }
但不支持on { a: -1, b: -1 }
or {a: 1, b: 1}
。
来源:https ://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/