GreenPlum--索引詳解

索引的使用:

1、在分佈式數據庫中如GP中,應保守使用索引。
解釋:

1)OLTP系統中,比如Oracle會大量使用索引,因爲在事物不斷變化的系統中,使用索引可以有效提高查詢和修改的性能。
2)OLAP系統中,累積了大量的歷史數據,而且修改和刪除的操作會比OLTP系統少很多。
3)分佈式數據庫中,對順序讀取的性能是非常高的,而索引本質上是個隨機尋址操作,這不適合分佈式數據庫。
4)對於GP而言,數據已經分佈到各個segment上,在加上分區,掃描的範圍就更小。
5)索引的目的是幫助我們找到想要的數據,綜合3)4)完全可以說是應該更保守使用索引。

2、在返回一定量結果的情況下(量比較小),索引同樣可以有效改善壓縮AO表上的查詢性能
3、GP會自動給爲主鍵建立主鍵索引。

主表建立索引,默認給子表分區表也會創建索引。在分區表中,修改主表分區名,子表分區名也會跟着修改,但是索引不會這樣,主表索引修改後,需要手動修改子表索引。

4、需確保索引的創建在查詢工作負載中真正被使用到。

創建索引需要考慮的問題

查詢工作負載
AO表:查詢AO表是需要對其先進行解壓,使用索引的話,就會只解壓索引範圍內的數據。
避免在頻繁更新的列上使用索引
創建選擇性B-tree索引(高於0.8)(distinct 值)
低選擇性列上使用位圖索引
索引列用於關聯
索引列經常用在查詢條件中

一、索引的類型:

PostgreSQL提供了多種索引類型:B-Tree、Hash、GiST和GIN,由於它們使用了不同的算法,因此每種索引類型都有其適合的查詢類型。缺省時,CREATE INDEX命令將創建B-Tree索引。
GP中常用的是:B-Tree和Bitmap索引。
PostgreSQL中沒有Bitmap索引,而GP中刪除了Hash索引。
GP中使用唯一索引時必須包含DK,唯一索引不支持AO表。
解釋:一般AO表是分區表,唯一索引只能在某個分區表中唯一,而不能對這張表都唯一。

1. B-Tree:平衡樹

通過樹形結構將所有數據組織,然後開枝散葉分佈在每一個枝葉上,通過二分法算法進行掃描數據,存儲的結構是列的role_id,id值,鍵值,隨着數據表的數據增多,索引線性增多。
在關係型數據庫中用的非常多,因爲在這類數據庫中多使用第三範式的數據結構創建,爲了儘量減少數據的冗餘,就造成數據的選擇性比較高。
CREATE TABLE test1 (
    id integer,
    content varchar
);
CREATE INDEX test1_id_index ON test1 (id);    
B-Tree索引主要用於等於和範圍查詢,特別是當索引列包含操作符" <、<=、=、>=和>"作爲查詢條件時,PostgreSQL的查詢規劃器都會考慮使用B-Tree索引。在使用BETWEEN、IN、IS NULL和IS NOT NULL的查詢中,PostgreSQL也可以使用B-Tree索引。然而對於基於模式匹配操作符的查詢,如LIKE、ILIKE、~和 ~*,僅當模式存在一個常量,且該常量位於模式字符串的開頭時,如col LIKE 'foo%'或col ~ '^foo',索引纔會生效,否則將會執行全表掃描,如:col LIKE '%bar'。 

2.位圖索引(適用重複值較多)

適合於數據倉庫應用;
每個位圖對應一組數據表中相同值行的ID記錄;
Bitmap索引空間佔用小;
位圖的每一位對應源數據的標識符,被設置的位對應的記錄包含該位圖相同的值;
創建速度快;
允許鍵值爲空;(B-tree不允許)比如where 條件判斷 is null B-tree 就不會走索引,而位圖仍舊會走索引
表記錄的高效訪問;

使用條件:

·何時使用位圖索引:
Bitmap索引在DISTINCT值數量在100和100000之間時可以有較好的表現;
在特徵合適的列上使用Bitmap索引好於B-tree索引;
位圖索引在分析查詢方面性能較好

·何時不宜使用位圖索引
位圖索引不適合用於唯一性列和DISTINCT值很高的列;
位圖索引不合適大量併發事務更新數據的OLTP類型應用。

3.創建索引

使用CREATE INDEX在表中定義索引,缺省創建B-tree索引。
例如:
CREATE INDEX idx_01 ON tb_cp_02(id);
創建位圖索引:
CREATE INDEX bmidx_01 ON tb_cp_02 USING BITMAP(date);
\h create index

在這裏插入圖片描述
檢查索引使用:

通過EXPLAIN命令來檢查查詢是否使用了索引,在輸出結果中查找下面的查詢節點以確認索引的使用 Index Scan -掃描索引
Bitmap Heap Scan
-從BitmapAnd,BitmapOr或BitmapIndexScan和數據文件生成的記錄所產生的Bitmap中檢索數據 Bitmap Index Scan --從索引底層掃描那些與查詢相匹配的位圖索引 BitmapAnd or BitmapOr
–將來自多個位圖索引掃描的節點進行And或Or連接,生成一個新的位圖作爲輸出

分析:
爲什麼會出現Bitmap Heap Scan而不是簡單的Bitmap Scan呢?
我們可能對錶中多個字段創建位圖索引,當對錶中數據進行where條件過濾是使用了這多個字段,就會出現Bitmap Heap Scan

備註:在GP中默認是不使用索引掃描的,默認是順序掃描

show enable_seqscan;

在這裏插入圖片描述
關閉默認掃描方式:

set enable_seqscan=off;

檢查索引的使用:

很難通過一個通用的程序來確定哪些場景要使用索引,大量的測試是必要的:
在創建和更新索引後進行ANALYZE 使用真實數據測試
使用很小的數據量來測試是致命的錯誤
當索引沒有被使用,必要情況下可以強制使用

重建索引:
重建索引將使用存儲在索引表中的數據建立新的索引取代舊的索引;
更新和刪除操作不更新位圖索引
在這裏插入圖片描述
重建全部索引:REINDEX TABLE tb_cp_02;
重建特定索引:REINDEX INDEX bmidx_01;

刪除索引
在裝載數據時,通常先刪除索引,再重建索引使用DROP INDEX命令刪除特定索引(效率問題),例如:
DROP INDEX bmidx_01;

日常重建索引
對於B-tree索引,新重建的所有比存在較多更新的索引更快
重建索引可以回收過期的空間
在GP中,刪除索引然後創建通常比REINDEX更快
當更新索引列時,Bitmap索引不會被更新,需要手工的REINDEX

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章