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值的列。
-
頻繁操作的列都將不建議使用索引。