本文介紹雲原生資料倉儲AnalyticDB PostgreSQL版的索引類型和相關操作。
索引類型
雲原生資料倉儲AnalyticDB PostgreSQL版支援如下索引類型:
B-Tree索引。
位元影像索引。
說明位元影像索引(Bitmap Index)為每一個索引值都儲存一個位元影像,位元影像索引提供了和常規索引相同的功能且減少索引空間。對於擁有100至100,000個可區分值的列並且當被索引列經常與其他被索引列聯集查詢時,位元影像索引表現最佳。
BRIN索引(僅適用於Heap表)。
GIN索引。
GiST索引。
雲原生資料倉儲AnalyticDB PostgreSQL版暫不支援Hash索引。
索引的選擇原則
什麼情況下需要建立索引:
查詢返回的結果集小。
查詢返回單一記錄或非常小的資料集時(例如OLTP類型查詢),使用索引可以最佳化查詢效能。
壓縮表。
在壓縮過的追加最佳化表上使用索引,系統只會解壓必要的行,從而提升查詢效能。
如何選擇索引類型:
選擇性高的列使用B-tree索引。
例如,如果一個表有1000行資料並且一個列中有800個不同的值,則該索引的選擇度為0.8,索引的選擇性會比較高。唯一索引的選擇度總是1.0。
選擇度低的列使用位元影像索引。
例如區分值區間在100至100000之間的列,位元影像索引表現最好。
表資料量大,資料物理分布有一定有序性,查詢條件為
<、<=、=、>=或>,過濾效果較好的情況下,使用BRIN索引。在巨量資料集的情況下,BRIN索引與B-Tree索引相比,佔用的空間極小,效能相同。
如何選擇合適的列建立索引:
索引在串連中用到的列。
頻繁串連的列(例如外鍵列)上的索引能夠提升串連效能,這將讓查詢最佳化工具有更多可以使用的串連方式。
索引在謂詞中頻繁使用的列。
頻繁地在
WHERE子句中被引用的列是索引的首選。避免在頻繁更新的列上建立索引。
在一個頻繁更新的列上建立索引會增加該列被更新時所需要的寫操作資料量。
如何更好的使用索引:
避免建立重疊的索引。
在多列索引中,具有相同前置列的索引冗餘。
批量載入前刪除索引。
當載入大量資料到一個表中,建議先刪除索引並且在資料裝載完成後重建這些索引,將會比更新索引更快。
測試並且比較使用索引和不使用索引的查詢效能。
只有被索引列的查詢效能有提升時才增加索引。
建立完索引,建議對錶執行ANALYZE。
建立索引
您可以使用CREATE INDEX命令在表上建立索引,建立索引樣本如下:
B-Tree索引
在employee表的gender列上建立一個B-Tree索引。
CREATE INDEX gender_idx ON employee (gender);位元影像索引
在films表中的title列上建立一個位元影像索引。
CREATE INDEX title_bmp_idx ON films USING bitmap (title);BRIN索引
在customer表的c_custkey列上建立BRIN索引。
CREATE INDEX c_custkey_brin_idx ON customer USING brin(c_custkey) with(pages_per_range=2);GIN索引
在lineitem表的l_comment列上建立一個GIN索引,支援全文檢索搜尋。
CREATE INDEX lineitem_idx ON lineitem USING gin(to_tsvector('english', l_comment));在arrayt表的intarray數群組類型列上建立一個GIN索引。
CREATE INDEX arrayt_idx ON arrayt USING gin(intarray);
GiST索引
在customer表的c_comment列上建立一個GiST索引支援全文檢索搜尋。
CREATE INDEX customer_idx ON customer USING gist(to_tsvector('english', c_comment));
重建索引
您可以使用REINDEX INDEX命令重建索引,重建索引樣本如下:
重建索引my_index。
REINDEX INDEX my_index;重建my_table表上的所有索引。
REINDEX TABLE my_table;
刪除索引
您可以使用DROP INDEX命令刪除一個索引,刪除索引樣本如下:
DROP INDEX title_idx;在載入大量資料時,您可以先刪除所有索引並載入資料,然後重建索引速度會更快。
索引資料收集
您可以使用VACUUM命令收集索引資料,收集索引資料樣本如下:
VACUUM customer;僅BRIN索引需要使用索引資料收集。
更多資訊
關於索引的更多資訊,請參見Pivotal Greenplum 官方文檔。