# 11.4.索引和订购人

除了简单地查找查询返回的行之外,索引还可以按特定的排序顺序传递它们。这允许查询订购人无需单独的分拣步骤即可满足规范要求。在PostgreSQL当前支持的索引类型中,只有B-tree可以生成排序输出——其他索引类型以未指定的、依赖于实现的顺序返回匹配行。

规划师会考虑满足订购人通过扫描与规范匹配的可用索引,或通过按物理顺序扫描表并进行显式排序,来实现规范。对于需要扫描大部分表的查询,显式排序可能比使用索引更快,因为它需要更少的磁盘I/O,因为它遵循顺序访问模式。当只需要提取几行时,索引更有用。一个重要的特例是订购人结合限度 n:显式排序必须处理所有数据以识别第一个*n行,但如果存在与订购人第一个n*可以直接检索行,而无需扫描其余的行。

默认情况下,B-树索引以升序存储其条目,最后为空(表TID被视为其他相等条目中的分界线列)。这意味着对列上的索引进行正向扫描十、生产令人满意的产品按x订购(或者更详细地说,按x ASC订购最后为空).索引也可以向后扫描,产生令人满意的输出按x描述订购(或者更详细地说,按x顺序排序先为空自从先空是的默认值按描述订购).

可以通过包含选项来调整B树索引的顺序ASC, 描述, 先空,和/或最后为空创建索引时;例如:

CREATE INDEX test2_info_nulls_low ON test2 (info NULLS FIRST);
CREATE INDEX test3_desc_index ON test3 (id DESC NULLS LAST);

以升序存储且先为空的索引可以满足以下任一条件:由x ASC订购,先为空按x描述的订单最后为空取决于扫描的方向。

你可能想知道为什么要费心提供这四个选项,而两个选项加上向后扫描的可能性将涵盖订购人.在单列索引中,选项确实是多余的,但在多列索引中,它们可能很有用。考虑两列索引(x,y):这可以满足按x,y排序如果我们向前看,或者订单由x描述,y描述如果我们向后扫描。但应用程序可能经常需要使用由x ASC、y DESC订购.无法从普通索引中获得排序,但如果该索引定义为(x ASC,y DESC)(x描述,y ASC).

显然,具有非默认排序顺序的索引是一种相当特殊的功能,但有时它们会对某些查询产生巨大的加速。是否值得维护这样的索引取决于您使用需要特殊排序的查询的频率。