什麼是位圖索引?
位圖索引就是用一個位圖表格來存放記錄是否可見的結構。
位圖索引的一些特性?
位圖索引實現方法: 用一個BIT位來表示這個屬性對應的值是否存在,存在爲1,不存在爲0.
位圖索引作用範圍:處理狀態值,也可以說可選擇度很高的情形。
位圖索引的優缺點?
位圖索引優勢: A, 可以很大的壓縮比率節省空間;B,非常快速的定位到檢索值可見與否。
位圖索引缺陷: A, 位圖本身無序存儲,每次檢索對磁盤都是一次隨機IO;B,因爲壓縮存儲,適合OLAP應用。 當然也可以不用壓縮,比如INFOBRIGHT就提供這樣的功能。
PostgreSQL不支持位圖索引,所以也就不支持位圖信息的壓縮存儲。 不過在創建查詢計劃的時候,會爲普通的索引(BTREE,HASH)等建立位圖表,即爲Bitmap Heap Table.
其中
Bitmap Index Scan 用來在內存中創建一個位圖表,每一個BIT表示一個與過濾條件有關的頁面。 此頁面有可能有數據爲1,不可能爲0.
Bitmap Heap Scan. 在內存中創建好的位圖表指針對應的頁面進行順序掃描,排除不符合的記錄。
來看下位圖掃描的例子。
表bitmap_test 字段is_visible 可選擇性很高,只有兩個值,
對於查詢語句select is_visible from bitmap_test where is_visible = 'yes'來說,對應的查詢計劃:
QUERY PLAN ------------------------------------------------------------------------------------------------------------------------- ------------------- Bitmap Heap Scan on bitmap_test (cost=2023.16..4157.75 rows=99967 width=4) (actual time=24.373..41.054 rows=100000 loop s=1) Recheck Cond: (is_visible = 'yes'::bpchar) -> Bitmap Index Scan on idx_bitmap_is_visible (cost=0.00..1998.17 rows=99967 width=0) (actual time=24.252..24.252 ro ws=100000 loops=1) Index Cond: (is_visible = 'yes'::bpchar) Total runtime: 47.175 ms (5 rows) Time: 47.725 ms
從上面這個查詢EXPLAIN結果來看, 先是創建一個位圖表,完了往上推到頁面,在頁面裏重新檢查每行記錄的值滿足過濾條件。 所有完結後,打印結果。