Chapter 8. 索引

Table of Contents
8.1. 介紹
8.2. 索引類型
8.3. 多欄位索引
8.4. 唯一索引
8.5. 函數索引
8.6. 運算子表
8.7. 部分索引
8.8. 檢查索引的使用

索引是提高資料庫性能的常用方法。 索引可以令資料庫伺服器以比沒有索引快得多的速度尋找和 檢索特定的行.不過索引也在總體上增加了資料庫系統的過荷, 因此我們應該有意識地使用它們.

8.1. 介紹

索引使用的一個經典的範例就是有象下面這樣的一個表︰

CREATE TABLE test1 (
    id integer,
    content varchar
);

並且應用需要大量的從下面查詢語句進行的查詢

SELECT content FROM test1 WHERE id = constant;

通常,資料庫系統將不得不一行一行地掃描整個 test1 以尋找所有相符的記錄. 如果在 test1 裡面有許多 行,但是只傳回少數幾行(可能是零個或者是一個), 那麼上面這個方法可就不是個有效的方法.如果我們 教導資料庫系統在 id 列上 維護一個索參照於定位相符的行.這樣,資料庫系統 就可能只需要在搜尋樹種走少數的幾步就可以找到相符行.

在大多數非小說的書籍裡面都使用了類似這樣的方法︰ 在書的背後收集著讀者會經常尋找的術語和概念的索引,並按照字母 順序排列.有興趣的讀者可以相對快速地掃描該索引並且切換到 合適的頁,因此就不用閱讀整本書才能尋找到感興趣的位置. 作者的任務之一就是預計哪些項是讀者最需要尋找的東西, 與之類似,預計哪些索引可以帶來便利也使資料庫程式員的任務.

下面的命令可以用於在 id 列上 建立我們討論那樣的索引︰

CREATE INDEX test1_id_index ON test1 (id);

你可以自由選擇索引名幾 test1_id_index, 但是應該選那些稍後可以讓你回憶起你索引的是什麼東西的名幾.

要刪除一個索引,使用 DROP INDEX 命令. 你可以在任何時候向表裡增加索引或者從表中刪除索引.

一旦你建立了索引,那麼就不在需要更多的幹涉了︰ 當系統認為用索引表順序的表掃描快的時候它就會 使用索引.不過你可能必須經常性地運行ANALYZE 命令以更新統計資訊,好讓查詢規劃器能夠做出有訓練的判斷. 又見 Chapter 10 獲取關於 如何獲知是否使用了索引的資訊,以及何時何因下規劃器會決定 使用索引.

索引對帶搜尋條件的 UPDATEDELETE 也有好處. 索引還可以用於 表連線方法.因此,如果你定義了索引的列是連線條件的一部分, 那麼它可以顯著提高帶連線的查詢的速度.

在建立索引的時候,它必須和表保持同步.這些操作增加了資料 操作的負荷.因此我們應該把那些非關鍵或者根本用不上的索引刪除掉. 請注意一個查詢或者一次資料操作命令在一個表上最多可以使用一個索引.