索引(升序与降序)的顺序是否重要?

时间:2012-09-09 08:59:24

标签: database indexing

有些人说复合指数然后订购物质。有人说排序并不重要。

哪一个是对的?为什么?

我的意思是,如果我查看手机,我看不出手机是否按照z到z的方式排序。如何改变复合指数?

注意:我的意思是在降序或升序意义上排序。我很清楚列的排序很重要。

注意我们有高分会员的2个答案。有人说,即使对于compond指数,下降或上升也无关紧要。另一位说重要。所以是的,这里存在争议。我在哪里(或我们)可以挖掘更多。

4 个答案:

答案 0 :(得分:4)

在一般情况下订购确实很重要。问题是:你指的是什么顺序,在你的情况下是否重要?

  1. Descending vs Ascending。仅在非常特殊的情况下才有意义,您实际上希望按特殊顺序排序结果。假设您希望您的结果如下:

    asc,b desc,c asc

  2. 但您的索引是

    a asc, b asc, c asc
    

    数据库必须进行额外的排序。当您想要根据某个顺序访问前n个元素时,同样适用。这对于组合索引更为重要,因为单个列的方向更改会导致完全不同的总排序,而单个列索引中单个列的排序只会颠倒排序。

    1. 对列进行排序

      a,b,c

    2. vs

      b, a, c
      

      如果对所有列进行过滤,则不会产生太大影响,但如果仅过滤a,则第一个索引将比第二个索引更有用。

      每当你有两种选择来解决编程语言中的问题并且有人告诉你它们没有区别时,请问为什么这两个选项存在。如果'某人'无法回答这个问题,我不相信他对两者的建议是等价的。

答案 1 :(得分:3)

我认为混淆是基于“排序”的两种不同含义。

  1. 索引项目是按升序还是降序排序。
  2. 在复合索引中,首先使用哪一列对项目进行排序
  3. 正如你所提到的,第一个并不重要。然而,第二个确实很重要。

答案 2 :(得分:1)

假设您有两个字段,姓名和姓氏。 (姓名,姓氏)上的复合索引与(姓氏,姓名)上的复合索引不同。搜索将从第一列开始,然后从第二列开始。因此,如果您使用姓氏进行搜索,(姓名,姓氏)上的复合索引将慢于(姓氏,名称)上的复合索引。

答案 3 :(得分:0)

例如,在字段a上为收集记录创建一个升序索引:

db.records.createIndex( { a: 1 } )

此索引可以支持a上的升序排序,并且还可以 通过以相反的顺序遍历索引来对a进行降序排序:

db.records.find().sort( { a: 1 } )
db.records.find().sort( { a: -1 } )
  

您对手机是正确的,因为默认情况下,搜索结果按$natural-https://docs.mongodb.com/manual/reference/method/cursor.sort/#return-in-natural-order

排序

对于复合索引,排序很重要。 例如,索引键模式{ a: 1, b: 1 } 可以支持{ a: 1, b: 1 }上的排序,但不支持{ b: 1, a: 1 }上的

对于将复合索引用于排序的查询,cursor.sort()文档中所有键的指定排序方向必须与索引键模式匹配或与索引键模式相反。例如,索引键模式{ a: 1, b: -1 } 可以支持{ a: 1, b: -1 }{ a: -1, b: 1 }上的排序,但支持{ a: -1, b: -1 }上的 {a: 1, b: 1}

来源:https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/