云數(shù)據(jù)庫GaussDB創(chuàng)建和管理索引
背景信息
索引可以提高數(shù)據(jù)的訪問速度,但同時也增加了插入、更新和刪除操作的處理時間。所以是否要為表增加索引,索引建立在哪些字段上,是創(chuàng)建索引前必須要考慮的問題。需要分析應用程序的業(yè)務處理、數(shù)據(jù)使用、經(jīng)常被用作查詢的條件或者被要求排序的字段來確定是否建立索引。
索引建立在數(shù)據(jù)庫表中的某些列上。因此,在創(chuàng)建索引時,應該仔細考慮在哪些列上創(chuàng)建索引。
1.在經(jīng)常需要搜索查詢的列上創(chuàng)建索引,可以加快搜索的速度。
2.在作為主鍵的列上創(chuàng)建索引,強制該列的唯一性和組織表中數(shù)據(jù)的排列結構。
3.在經(jīng)常使用連接的列上創(chuàng)建索引,這些列主要是一些外鍵,可以加快連接的速度。
4.在經(jīng)常需要根據(jù)范圍進行搜索的列上創(chuàng)建索引,因為索引已經(jīng)排序,其指定的范圍是連續(xù)的。
5.在經(jīng)常需要排序的列上創(chuàng)建索引,因為索引已經(jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時間。
6.在經(jīng)常使用WHERE子句的列上創(chuàng)建索引,加快條件的判斷速度。
7.為經(jīng)常出現(xiàn)在關鍵字ORDER BY、GROUP BY、DISTINCT后面的字段建立索引。
說明:索引創(chuàng)建成功后,系統(tǒng)會自動判斷何時引用索引。當系統(tǒng)認為使用索引比順序掃描更快時,就會使用索引。
索引創(chuàng)建成功后,必須和表保持同步以保證能夠準確地找到新數(shù)據(jù),這樣就增加了數(shù)據(jù)操作的負荷。因此請定期刪除無用的索引。
云數(shù)據(jù)庫GaussDB創(chuàng)建索引操作步驟
創(chuàng)建分區(qū)表的步驟請參考創(chuàng)建和管理分區(qū)表。
創(chuàng)建索引
?創(chuàng)建分區(qū)表索引tpcds_web_returns_p2_index1,不指定索引分區(qū)的名稱。
openGauss=# CREATE INDEX tpcds_web_returns_p2_index1 ON tpcds.web_returns_p2 (ca_address_id) LOCAL;
當結果顯示為如下信息,則表示創(chuàng)建成功。
CREATE INDEX
?創(chuàng)建分區(qū)表索引tpcds_web_returns_p2_index2,并指定索引分區(qū)的名稱。
openGauss=# CREATE INDEX tpcds_web_returns_p2_index2 ON tpcds.web_returns_p2 (ca_address_sk) LOCAL
( PARTITION web_returns_p2_P1_index,
PARTITION web_returns_p2_P2_index TABLESPACE example3,
PARTITION web_returns_p2_P3_index TABLESPACE example4,
PARTITION web_returns_p2_P4_index,
PARTITION web_returns_p2_P5_index,
PARTITION web_returns_p2_P6_index,
PARTITION web_returns_p2_P7_index,
PARTITION web_returns_p2_P8_index ) TABLESPACE example2;
當結果顯示為如下信息,則表示創(chuàng)建成功。
CREATE INDEX
修改索引分區(qū)的表空間
?修改索引分區(qū)web_returns_p2_P2_index的表空間為example1。
openGauss=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P2_index TABLESPACE example1;
當結果顯示為如下信息,則表示修改成功。
ALTER INDEX
?修改索引分區(qū)web_returns_p2_P3_index的表空間為example2。
openGauss=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P3_index TABLESPACE example2;
當結果顯示為如下信息,則表示修改成功。
ALTER INDEX
重命名索引分區(qū)
執(zhí)行如下命令對索引分區(qū)web_returns_p2_P8_index重命名web_returns_p2_P8_index_new。
openGauss=# ALTER INDEX tpcds.tpcds_web_returns_p2_index2 RENAME PARTITION web_returns_p2_P8_index TO web_returns_p2_P8_index_new;
當結果顯示為如下信息,則表示重命名成功。
ALTER INDEX
查詢索引
?執(zhí)行如下命令查詢系統(tǒng)和用戶定義的所有索引。
openGauss=# SELECT RELNAME FROM PG_CLASS WHERE RELKIND='i';
?執(zhí)行如下命令查詢指定索引的信息。
openGauss=# \di+ tpcds.tpcds_web_returns_p2_index2
刪除索引
openGauss=# DROP INDEX tpcds.tpcds_web_returns_p2_index1;
openGauss=# DROP INDEX tpcds.tpcds_web_returns_p2_index2;
當結果顯示為如下信息,則表示刪除成功。
DROP INDEX
GaussDB支持4種創(chuàng)建索引的方式請參見表1-1。
說明:
索引創(chuàng)建成功后,系統(tǒng)會自動判斷何時引用索引。當系統(tǒng)認為使用索引比順序掃描更快時,就會使用索引。
索引創(chuàng)建成功后,必須和表保持同步以保證能夠準確地找到新數(shù)據(jù),這樣就增加了數(shù)據(jù)操作的負荷。因此請定期刪除無用的索引。
|
索引方式
|
描述
|
|---|---|
唯一索引 |
可用于約束索引屬性值的唯一性,或者屬性組合值的唯一性。如果一個表聲明了唯一約束或者主鍵,則GaussDB自動在組成主鍵或唯一約束的字段上創(chuàng)建唯一索引(可能是多字段索引),以實現(xiàn)這些約束。目前,GaussDB只有B-Tree及UBTree可以創(chuàng)建唯一索引。 |
多字段索引 |
一個索引可以定義在表中的多個屬性上。目前,GaussDB中的B-Tree支持多字段索引,且最多可在32個字段上創(chuàng)建索引。 |
部分索引 |
建立在一個表的子集上的索引,這種索引方式只包含滿足條件表達式的元組。 |
表達式索引 |
索引建立在一個函數(shù)或者從表中一個或多個屬性計算出來的表達式上。表達式索引只有在查詢時使用與創(chuàng)建時相同的表達式才會起作用。 |
云數(shù)據(jù)庫GaussDB創(chuàng)建表操作步驟
創(chuàng)建一個普通表
openGauss=# CREATE TABLE tpcds.customer_address_bak AS TABLE tpcds.customer_address;
INSERT 0 0
創(chuàng)建普通索引
如果對于tpcds.customer_address_bak表,需要經(jīng)常進行以下查詢。
openGauss=# SELECT ca_address_sk FROM tpcds.customer_address_bak WHERE ca_address_sk=14888;
通常,數(shù)據(jù)庫系統(tǒng)需要逐行掃描整個tpcds.customer_address_bak表以尋找所有匹配的元組。如果表tpcds.customer_address_bak的規(guī)模很大,但滿足WHERE條件的只有少數(shù)幾個(可能是零個或一個),則這種順序掃描的性能就比較差。如果讓數(shù)據(jù)庫系統(tǒng)在ca_address_sk屬性上維護一個索引,用于快速定位匹配的元組,則數(shù)據(jù)庫系統(tǒng)只需要在搜索樹上查找少數(shù)的幾層就可以找到匹配的元組,這將會大大提高數(shù)據(jù)查詢的性能。同樣,在數(shù)據(jù)庫中進行更新和刪除操作時,索引也可以提升這些操作的性能。
使用以下命令創(chuàng)建索引。
openGauss=# CREATE INDEX index_wr_returned_date_skON tpcds.customer_address_bak (ca_address_sk);
CREATE INDEX
創(chuàng)建唯一索引
在表tpcds.ship_mode_t1上的SM_SHIP_MODE_SK字段上創(chuàng)建唯一索引。
openGauss=# CREATE UNIQUE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1(SM_SHIP_MODE_SK);
創(chuàng)建多字段索引
假如用戶需要經(jīng)常查詢表tpcds.customer_address_bak中ca_address_sk是5050,且ca_street_number小于1000的記錄,使用以下命令進行查詢。
openGauss=# SELECT ca_address_sk,ca_address_idFROM tpcds.customer_address_bak WHEREca_address_sk = 5050 AND ca_street_number 1000;
使用以下命令在字段ca_address_sk和ca_street_number上定義一個多字段索引。
openGauss=# CREATE INDEX more_column_index ON tpcds.customer_address_bak(ca_address_sk ,ca_street_number );
CREATE INDEX
創(chuàng)建部分索引
如果只需要查詢ca_address_sk為5050的記錄,可以創(chuàng)建部分索引來提升查詢效率。
openGauss=# CREATE INDEX part_index ON tpcds.customer_address_bak(ca_address_sk) WHERE ca_address_sk = 5050;
CREATE INDEX
創(chuàng)建表達式索引
假如經(jīng)常需要查詢ca_street_number小于1000的信息,執(zhí)行如下命令進行查詢。
openGauss=# SELECT * FROM tpcds.customer_address_bakWHERE trunc(ca_street_number) 1000;
可以為上面的查詢創(chuàng)建表達式索引:
openGauss=# CREATE INDEX para_index ON tpcds.customer_address_bak (trunc(ca_street_number));
CREATE INDEX
刪除tpcds.customer_address_bak表
openGauss=# DROP TABLE tpcds.customer_address_bak;
DROP TABLE
云數(shù)據(jù)庫GaussDB索引約束
使用約束
索引使用滿足如下條件時:
1.在同一個表的同一個列上建立了多個gin索引;
2.這些gin索引使用了不同的parser(即分隔符不同);
3.在查詢中使用了該列,且執(zhí)行計劃中使用索引進行掃描;
為了避免使用不同gin索引導致查詢結果不同的問題,需要保證在物理表的一列上只有一個gin索引可用。
云數(shù)據(jù)庫GaussDB索引設計規(guī)范
1.使用數(shù)據(jù)庫索引實踐推薦的索引類型。
索引設計建議使用推薦類型,如果需要使用禁用、不推薦、限制使用的索引類型,建議聯(lián)系GaussDB數(shù)據(jù)庫專家進行評估。
表1-1 數(shù)據(jù)庫索引實踐推薦
|
索引類型
|
說明
|
是否推薦
|
|---|---|---|
主鍵/唯一索引 |
單列或多列主鍵/唯一索引 |
推薦 |
表達式索引 |
索引列為表的一列或多列計算而來的一個函數(shù)或者標量表達式 |
限制使用 |
2.對于HASH分布表,主鍵和唯一索引必須包含分布鍵。
3.合理設計組合索引,避免冗余。
例如已對(a,b,c)創(chuàng)建索引,則不應再單獨對 (a)、(b)、(c)、(a,b)、(b,c)創(chuàng)建索引。
當查詢時如果只帶有a字段上的過濾條件,一般也會利用組合索引進行查詢。
4.不建議單表創(chuàng)建多個唯一索引。
同時維護多個唯一索引的開銷遠大于維護一個多列唯一索引,如果業(yè)務邏輯上多個唯一索引,與一個多列唯一索引等價,應使用多列唯一索引。
5.組合索引字段個數(shù)不超過5個。
6.禁止組合索引組合字符串的總長度超過200。
7.索引(包括單列索引和復合索引)字段應為NOT NULL字段。
8.同字段上創(chuàng)建索引的維護效率不同。數(shù)值類型字段優(yōu)于字符類型及其他數(shù)據(jù)類型,因此對于考慮創(chuàng)建索引的ID、時間等字段,建議使用數(shù)值類型進行存儲。
9.建議在關聯(lián)列上創(chuàng)建索引。
GaussDB支持HASH JOIN,但是當內表較小等RESCAN代價較低的情況下,仍然可能選擇NESTLOOP JOIN來完成關聯(lián)。如果通過EXPLAIN可以查看到NESTLOOP JOIN計劃,則可以通過在關聯(lián)列上創(chuàng)建索引,提高NESTLOOP JOIN效率。
專題內容推薦
活動對象:華為云電銷客戶及渠道伙伴客戶可參與消費滿送活動,其他客戶參與前請咨詢客戶經(jīng)理
活動時間: 2020年8月12日-2020年9月11日
活動期間,華為云用戶通過活動頁面購買云服務,或使用上云禮包優(yōu)惠券在華為云官網(wǎng)新購云服務,累計新購實付付費金額達到一定額度,可兌換相應的實物禮品?;顒觾?yōu)惠券可在本活動頁面中“上云禮包”等方式獲取,在華為云官網(wǎng)直接購買(未使用年中云鉅惠活動優(yōu)惠券)或參與其他活動的訂單付費金額不計入統(tǒng)計范圍內;