【问题标题】:When would you define an index with a descending order?你什么时候定义一个降序的索引?
【发布时间】:2010-03-03 11:49:58
【问题描述】:

通过一些 SQL 实现,我注意到大多数 DBMS 支持在列上定义具有降序的索引,例如

CREATE INDEX anIndex ON aTable (aColumn DESC);

什么时候这会比 ASC 索引更有利?为什么 ASC 或 DESC 是索引定义的一部分?

如果索引的实现是高效的(B 树甚至是排序列表中的二进制搜索),我看不出 ASC 或 DESC 索引之间有任何实质性区别。

我错过了什么?

【问题讨论】:

    标签: database-design indexing


    【解决方案1】:

    如果表是聚簇的,索引实际上变成了这样:

    acolumn DESC, id ASC
    

    并且可以在查询中使用

    SELECT  TOP 1 *
    FROM    mytable
    ORDER BY
            acolumn DESC, id ASC
    

    SELECT  TOP 1 *
    FROM    mytable
    ORDER BY
            acolumn ASC, id DESC
    

    ,但不在

    SELECT  TOP 1 *
    FROM    mytable
    ORDER BY
            acolumn DESC, id DESC
    

    对于复合索引,列也可以按相反方向排序:

    CREATE INDEX anIndex ON aTable (aColumn DESC, bColumn ASC);
    

    【讨论】:

      【解决方案2】:
      1. 当您认为用户需要以相反的顺序查看数据时。有时可以使用索引来优化 ORDER BY。

      2. 当您尝试使用物理存储玩棘手的游戏以将具有某些属性的行聚集在一起时。

      【讨论】:

      • A B-Tree 可以双向遍历,无论比较函数如何。
      • @Quassnoi:有趣的一点。这与回答为什么有人需要逆序索引有什么关系?
      • 我的意思是DESC-ordered 查询可以使用ASC-ordered 索引以及DESC-ordered 索引。字段排序仅对复合索引有意义。
      • 是的。我唯一考虑在(col1 ASC, col2 DESC) 上创建索引的情况是,如果该索引旨在支持需​​要按col1 ASC col2 DESC 对数据进行排序的业务关键型查询。
      猜你喜欢
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多