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