索引管理
本文介紹云原生數據倉庫AnalyticDB PostgreSQL版的索引類型和相關操作。
注意事項
Serverless模式實例僅支持創建B-Tree類型索引。
Serverless模式實例如果創建了索引,會影響系統擴縮容的性能。擴縮容完成時間與索引的數據量成正比關系。
索引類型
云原生數據倉庫AnalyticDB PostgreSQL版支持如下索引類型:
B-Tree索引(默認索引類型)
位圖索引
說明位圖索引(Bitmap Index)為每一個鍵值都存儲一個位圖,位圖索引提供了和常規索引相同的功能且減少索引空間。對于擁有100至100000個可區分值的列并且當被索引列經常與其他被索引列聯合查詢時,位圖索引表現最佳。
BRIN索引(僅AnalyticDB PostgreSQL 6.0版支持)
GIN索引(僅AnalyticDB PostgreSQL 6.0版支持)
GiST索引(僅AnalyticDB PostgreSQL 6.0版支持)
云原生數據倉庫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索引,支持全文搜索(僅AnalyticDB PostgreSQL 6.0版支持)。
CREATE INDEX lineitem_idx ON lineitem USING gin(to_tsvector('english', l_comment));
GIN索引
在arrayt表的intarray數組類型列上創建一個GIN索引(僅AnalyticDB PostgreSQL 6.0版支持)。
CREATE INDEX arrayt_idx ON arrayt USING gin(intarray);
GiST索引
在customer表的c_comment列上創建一個GiST索引支持全文搜索(僅AnalyticDB PostgreSQL 6.0版支持)。
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 官方文檔。