Chapter 11. 索引

Table of Contents
11.1. 介紹
11.2. 索引類型
11.3. 多字串索引
11.4. 唯一索引
11.5. 資料表達式上的索引
11.6. 操作符資料表
11.7. 部分索引
11.8. 檢查索引的使用

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

11.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 13 獲取關於如何獲知是否使用了索引的訊息, 以及何時何因下規劃器會決定使用索引。

索引對帶搜索條件的 UPDATEDELETE 也有好處。 索引更可以用於資料表連接查詢。因此,如果您定義了索引的列是連接條件的一部分, 那麼它可以顯著提高帶連接的查詢的速度。

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