【问题标题】:Does order of indexing (ascending vs descending) matter?索引顺序(升序还是降序)重要吗?
【发布时间】:2012-09-02 11:59:33
【问题描述】:

有人说复合索引然后排序很重要。有人说订购无关紧要。

哪一个是对的?为什么?

我的意思是,如果我查看手机,我根本看不出手机是如何排序的。复合索引会有什么变化?

注意:我的意思是按降序或升序的意思排序。我很清楚列的顺序很重要。

请注意,我们有 2 个高分成员的答案。有人说,即使对于复合索引,降序或升序也无关紧要。另一个说这很重要。所以是的,这里有争议。我(或我们)在哪里可以挖掘更多。

【问题讨论】:

  • 如果它是多维的,那么它确实很重要 - 例如,array[1][2] 表示第 2 行和第 3 列,而 array[2][1] 则相反。
  • 我知道这一点。我问的是它的下降或上升方面。

标签: database indexing


【解决方案1】:

例如,在字段 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/

【讨论】:

    【解决方案2】:

    一般情况下的顺序确实很重要。问题是:您指的是什么顺序,这对您的情况有影响吗?

    1. 下降与上升。仅在您实际上希望以特殊顺序对结果进行排序的非常特殊的情况下才有意义。假设你希望你的结果是这样排序的:

      a asc, b desc, c asc

    但你的索引是

    a asc, b asc, c asc
    

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

    1. 列的顺序

      a、b、c

    对比

    b, a, c
    

    如果您过滤所有列并没有太大区别,但如果您只过滤 a,第一个索引将比第二个索引更有用。

    当您有两种解决编程语言问题的选择时,如果有人告诉您它们没有任何作用,请询问为什么存在这两种选择。如果“某人”不能回答这个问题,我不会相信他关于两者等同的建议。

    【讨论】:

    • 对不起,我的意思是升序降序。为什么它对多个索引很重要。
    • 索引列的排序顺序是否对维护很重要?就像您在索引中定义要排序 DESC 的列,但表中的所有插入都具有该索引的递增值,是否必须移动大量数据才能使新行在“顶部”建立索引?跨度>
    • 看起来碎片化确实很重要...stackoverflow.com/a/9382500/45767
    【解决方案3】:

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

    1. 索引项是按升序还是降序排序。
    2. 在复合索引中,首先使用哪一列对项目进行排序

    正如您提到的,第一个无关紧要。不过,第二个确实很重要。

    【讨论】:

    • 第一个对复合索引有影响吗?第二个很明显。
    • Jens 说升序降序很重要。你说不是。好吧,我们在哪里可以解决这个问题? +1 为每个人:D
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2017-11-18
      • 2014-10-24
      • 1970-01-01
      • 2017-07-04
      • 2012-06-25
      • 1970-01-01
      • 2014-02-19
      • 2011-01-12
      相关资源
      最近更新 更多