BRIN 區塊索引

2021-09-22 07:40:01 字數 3131 閱讀 5636

brin 是一種新的索引掃瞄方式, 它可以加速掃瞄非常大的表,而沒有必要像b-tree等其他傳統索引的維護開銷。

它的工作方式是維護資料庫範圍的 "summary" 資料

位圖掃瞄的工作機制是通過讀取每乙個 summary 元組和拿該元組與查詢條件比較; 如果查詢條件的值在summary中,

在有損耗的tid點陣圖中,範圍內的全部的頁都將會返回。否則不會返回。傳統的索引掃瞄並不會採用這種方式,因為其

根本不會去儲存 tid。

乙個新的記錄插入到表中, brin索引會更新summary的資訊(如果插入的記錄在已經包含的資料塊中, 那麼這個元組

資訊將會被統計在內)否則不會更新。在最後一種情況, 使用 vacuum 或者 brin_summarize_new_values() 函式將會

建立 summary 資訊。

對於具有1維排序順序型別的資料, summary 資訊會包含每個欄位的最大值和最小值在page範圍內, 這種型別符號的操

作稱之為 "minmax", b-tree opclass 支援多種資料型別。 由於 brin的普遍性, 它也適合諸如陣列, 集合型別, 範圍型別

; 甚至是 列舉型別, 我們也可以去考慮實現特殊的minmax 操作。

catalog 可能出現一些變化,將會有更多令人興奮的功能實現, 向美好的方向前進。

感謝simon riggs, alvaro herrera heikki linnakangas

下面的實驗主要考慮一下內容

構建索引的時間花費

更新索引的時間花費

索引的大小

查詢走索引的訪問時間和 = 操作的時間

查詢使用索引的訪問時間和 between 操作的時間

實驗準備

建立兩個測試表

$ create table for_btree (id int8, payload text);

$ insert into for_btree (id, payload) select i, repeat('depesz', 100) from generate_series(1, 1000000) i;

$ create table for_brin (id int8, payload text);

$ insert into for_brin(id, payload) select i, repeat ('depesz', 100) from generate_series(1,1000000) i;

上述兩個表的大小都是 650mb,

建立索引耗時對比實驗

$ create index for_btree_id_idx on for_btree using btree (id);

$ create index for_brin_id_idx for_brin using brin (id);

更新索引的耗時對比實驗

$ update for_btree set id = 1000000 + id where id < 300000;

$ update for_brin set id = 1000000 + id where id < 300000;

檢視索引大小

$ /di+

查詢耗時對比實驗

= 操作的耗時對比

$ select count(*) from for_btree where id = 654321::int8;

$ select count(*) from for_brin where id = 654321::int8;

$ select count(*) from for_btree where id between 600000::int8 and 650000::int8;

$ select count(*) from for_brin where id between 600000::int8 and 650000::int8;

從上述實驗可以看出, 對於 = 操作也好, 還是 between and 操作也好, brin 索引的耗時都要比 btree 索引耗時多很多。

補充資訊, brin 索引是可以配置的。 我們可以從下面這張表中中得出具體的配置。具體的實現是通過修改引數 pages_per_range

的儲存引數來實現的。 值越小, 指數越大。 並可能執行更快,但是更新的耗時也隨之增加

pages_per_range index size create time update time search (=) time search (between) time

10000 24 kb 369.234 ms 8567.034 ms 87.606 ms 154.182 ms

1000 24 kb 373.150 ms 8812.391 ms 96.339 ms 133.546 ms

100 40 kb 360.555 ms 8867.043 ms 98.941 ms 131.126 ms

10 296 kb 392.038 ms 8619.480 ms 99.834 ms 132.327 ms

1 2800 kb 629.255 ms 8600.095 ms 114.882 ms 147.765 ms

這裡的問題是,該索引為何沒有加快索引(搜尋)的速度, 可能和資料的分布有很大關係。但是總的來說, 它使用了很小的索引

儲存開銷, 加快了一些查詢。這還是很不錯的。

5 5 區塊索引

超級賬本提供多種區塊索引 block index 方式,以便能夠快速找到區塊。這些方式包括 區塊編號 區塊雜湊 交易編號 同時按區塊編號和交易編號 加 入 會 員 微 信 dedao555 區塊交易編號 交易驗證碼。5.5.1 檔案位置指標 索引的內容是檔案位置指標 file location po...

5 5 區塊索引

超級賬本提供多種區塊索引 block index 方式,以便能夠快速找到區塊。這些方式包括 區塊編號 區塊雜湊 交易編號 同時按區塊編號和交易編號 加 入 會 員 微 信 dedao555 區塊交易編號 交易驗證碼。5.5.1 檔案位置指標 索引的內容是檔案位置指標 file location po...

區塊鏈 資料區塊

目錄 資料區塊記錄了整個位元幣網路上的交易記錄資料,並且這些資料是被所有位元幣節點共享的。位元幣的交易記錄會儲存在資料區塊之中,位元 幣系統中大約每10分鐘會產生乙個區塊,每個資料區塊一般包含區塊頭 header 和區塊體 body 兩部分,位元幣源 分析 區塊 區塊頭封裝了當前的版本號 versi...