【发布时间】:2010-03-03 11:49:58
【问题描述】:
通过一些 SQL 实现,我注意到大多数 DBMS 支持在列上定义具有降序的索引,例如
CREATE INDEX anIndex ON aTable (aColumn DESC);
什么时候这会比 ASC 索引更有利?为什么 ASC 或 DESC 是索引定义的一部分?
如果索引的实现是高效的(B 树甚至是排序列表中的二进制搜索),我看不出 ASC 或 DESC 索引之间有任何实质性区别。
我错过了什么?
【问题讨论】:
通过一些 SQL 实现,我注意到大多数 DBMS 支持在列上定义具有降序的索引,例如
CREATE INDEX anIndex ON aTable (aColumn DESC);
什么时候这会比 ASC 索引更有利?为什么 ASC 或 DESC 是索引定义的一部分?
如果索引的实现是高效的(B 树甚至是排序列表中的二进制搜索),我看不出 ASC 或 DESC 索引之间有任何实质性区别。
我错过了什么?
【问题讨论】:
如果表是聚簇的,索引实际上变成了这样:
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);
【讨论】:
当您认为用户需要以相反的顺序查看数据时。有时可以使用索引来优化 ORDER BY。
当您尝试使用物理存储玩棘手的游戏以将具有某些属性的行聚集在一起时。
【讨论】:
B-Tree 可以双向遍历,无论比较函数如何。
DESC-ordered 查询可以使用ASC-ordered 索引以及DESC-ordered 索引。字段排序仅对复合索引有意义。
(col1 ASC, col2 DESC) 上创建索引的情况是,如果该索引旨在支持需要按col1 ASC col2 DESC 对数据进行排序的业务关键型查询。