?
本文檔使用
php中文網(wǎng)手冊 發(fā)布
除了簡單地找到被查詢返回的行, 索引也能夠在一個(gè)特定的排序中提供它們。 這使得查詢的ORDER BY規(guī)范在沒有一個(gè)單獨(dú)的排序步驟下能夠?qū)崿F(xiàn)。 目前PostgreSQL支持的索引類型中,只有B-tree 能產(chǎn)生排序輸出— 其他索引類型返回 未指定的匹配行,依賴于實(shí)現(xiàn)秩序。
規(guī)劃器在通過掃描匹配規(guī)范的可用索引,或?qū)Ρ磉M(jìn)行物理順序掃描,做一個(gè)明確的 排序時(shí)會(huì)考慮滿足ORDER BY規(guī)范。當(dāng)對(duì)表進(jìn)行的查詢需要大范圍掃描時(shí),一個(gè)明確的排序很可能比使用索引要快。 因?yàn)閷?duì)于順序訪問模式,它需要 減少磁盤I/O。當(dāng)只有幾行需要獲取時(shí),索引更有用。 一個(gè)重要的特殊情況是ORDER BY連接 LIMIT n:明確的排序?qū)⑻幚? 所有的數(shù)據(jù),以確定第一個(gè)n行,但如果有一個(gè)索引匹配ORDER BY, 第一個(gè)n行可以直接檢索,沒有掃描其余的。
缺省情況下,B-tree索引存儲(chǔ)升序存放他們的記錄(空記錄在最前面)。 這意味著,向前索引掃描在列x產(chǎn)生滿足ORDER BY x的輸出(或更冗長,ORDER BY x ASC NULLS LAST)。 索引也可以向后掃描,產(chǎn)生滿足ORDER BY x DESC產(chǎn)生輸出(或更冗長,ORDER BY x DESC NULLS FIRST,因?yàn)? NULLS FIRST是 ORDER BY DESC的缺省)。
當(dāng)創(chuàng)建索引時(shí),你可以通過選項(xiàng)ASC, DESC, NULLS FIRST, 和(或者)NULLS LAST調(diào)整B-tree索引的排序,比如:
CREATE INDEX test2_info_nulls_low ON test2 (info NULLS FIRST); CREATE INDEX test3_desc_index ON test3 (id DESC NULLS LAST);
不論是對(duì)ORDER BY x ASC NULLS FIRST還是ORDER BY x DESC NULLS LAST,索引可以以升序存儲(chǔ)空值,這取決于在哪個(gè)方向上掃描。
你可能會(huì)問,當(dāng)兩個(gè)選項(xiàng)一起向后掃描的可能性將涵蓋ORDER BY的所有變化時(shí),為什么還要提供四個(gè)選項(xiàng)。 在單列索引中,選項(xiàng)確實(shí)是多余的,但在多字段索引中卻是有用。 思考一個(gè)關(guān)于(x, y)的兩字段索引:如果我們向前掃描,這可以 滿足ORDER BY x, y,或如果我們向后掃描,可以滿足 ORDER BY x DESC, y DESC。但可能應(yīng)用程序經(jīng)常需要使用 ORDER BY x ASC, y DESC。沒有辦法得到 一個(gè)普通索引的排序,但如果該指數(shù)被定義為(x ASC, y DESC)或者(x DESC, y ASC),那么就可能得到該排序。
顯然,非缺省排序的索引是一個(gè)相當(dāng)專業(yè)的功能,但有時(shí)卻可以提高某些查詢的速度。 是否值得維護(hù)這樣一個(gè)索引取決于你經(jīng)常使用需要一個(gè)特殊排序的查詢。