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 也有好處. 索引更可以用于表連接查詢。因此,如果你定義了索引的列是連接條件的一部分, 那麼它可以顯著提高帶連接的查詢的速度.

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