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