位置:首頁 > 數據庫 > PostgreSQL教學 > PostgreSQL索引

PostgreSQL索引

索引是一種特殊的查詢表,可以使用搜索引擎的數據庫以加快數據檢索。簡單地說,索引是表中的數據的一個指針,在一個數據庫中的索引是非常相似,如:一本書的目錄。

例如,如果想在一本書中引用的所有頁麵討論某個話題,先參考索引按字母順序列出所有目錄主題,然後轉到一個或多個特定的頁碼。

索引有助於加快SELECT查詢和WHERE子句,但它會減慢數據的輸入,UPDATE和INSERT語句。索引可以創建或刪除的數據冇有影響。

創建索引涉及CREATE INDEX語句,它允許命名的索引,索引指定表的一列或多列,並指示索引是否在升序或降序排列。

索引也可以是唯一的,類似UNIQUE約束,在列上有一個索引的列或組合索引防止重複項。

CREATE INDEX命令:

CREATE INDEX的基本語法如下:

CREATE INDEX index_name ON table_name;

索引類型

PostgreSQL提供了幾種索引類型:B-樹,哈希,GIST,SP-GiST和GIN。每個索引類型使用不同的算法,是最適合於不同類型的查詢。默認情況下,CREATE INDEX命令創建B-tree索引,適合最常見的情況。

單列索引:

單列索引是基於隻有一個表的列上創建。基本語法如下:

CREATE INDEX index_name
ON table_name (column_name);

多列索引:

多列索引定義一個表的多個列上。基本語法如下:

CREATE INDEX index_name
ON table_name (column1_name, column2_name);

是否要創建一個單列索引或多列索引,考慮使用非常頻繁查詢的WHERE子句中的列作為過濾條件。

應該有一列,單列索引應該是選擇。如果有兩個或多個列中經常使用的WHERE子句作為過濾器,多列索引將是最好的選擇。

唯一索引:

不僅使用唯一索引的性能,同時也為數據的完整性。唯一索引不允許任何重複的值插入到表中。基本語法如下:

CREATE INDEX index_name
on table_name (column_name);

部分索引:

部分索引是一個索引建在一個表的一個子集,該子集是一個條件表達式定義的(叫做部分索引的謂詞)。該指數包含的條目隻有那些滿足謂詞的表行。基本語法如下:

CREATE INDEX index_name
on table_name (conditional_expression);

隱索引:

隱式索引是由數據庫服務器創建一個對象時,會自動創建索引。索引自動創建的主鍵約束和唯一約束。

例子

下麵是一個例子,我們將創建一個索引表COMPANY 的salary列:

# CREATE INDEX salary_index ON COMPANY (salary);

現在,讓我們列出了所有的指標有公司使用d company 命令如下表:

# d company

這將產生以下結果,其中company_pkey是創建表時創建一個隱含的索引。

       Table "public.company"
 Column  |     Type      | Modifiers
---------+---------------+-----------
 id      | integer       | not null
 name    | text          | not null
 age     | integer       | not null
 address | character(50) |
 salary  | real          |
Indexes:
    "company_pkey" PRIMARY KEY, btree (id)
    "salary_index" btree (salary)

你可以列出整個索引數據庫使用 di命令: 

DROP INDEX命令:

一個索引可以使用PostgreSQL DROP命令刪除。應注意刪除索引,因為性能可能會減緩或改善。

基本語法如下:

DROP INDEX index_name;

可以使用下麵的語句來刪除以前創建的索引:

# DROP INDEX salary_index;

索引應該是可以避免的?

雖然索引的目的在於提高數據庫的性能,有時間時,應避免。使用索引時,應重新考慮下列準則:

  • 索引不應該被用於小表上。

  • 有頻繁的,大批量的更新或插入操作的表。

  • 索引不應使用含有大量的NULL值的列。

  • 頻繁操作的列都將不建議使用索引。