背景
寫這個文章的作用主要是做一些總結和梳理,特別是正對大數據場景下的實時寫入更新策略 COW
和 MOR
以及 Delete+Insert
的技術策略的演進,
這也適用于其他大數據的計算存儲系統。該文章主要參考了Primary Key table.
分析總結
Starrocks 的主鍵表主要是用來加速實時更新的效率,以及在做Adhoc查詢的時候能夠加速查詢速度。在paimon等數據表格式中,一開始都是采用的MOR
的策略來達到實時寫入的目的,但是在讀取的時候,就得進行合并的操作才能獲取真正的數據,這種方式雖然能加速數據的寫入速度,但是在讀取的時候就會比較慢,采用Delete+Insert
的方式,只會在寫入的時候在DelVector
增加一個標志位,讀取的時候,只讀最新的數據即可。大大的縮短了,數據讀取的時間。
Starrocks的Unique表和Aggreate表采用的是 MOR 的策略,這個會存在讀放大的問題。除此之外,由于存在Merge操作,謂詞和索引也不能下推到底層的數據源中
,即使下推了,也不能起到過濾的作用,這個嚴重的影響到了查詢的效率。
對于Starrocks的主鍵索引,讀寫主鍵表的路程如下(參考Starrocks的官方文檔):
-
對于寫: Starrocks 先把對應的tablets的主鍵索引加載到內存,對于刪除操作,Starrocks首先使用主鍵索引找到每行對應的數據位置,并在
DelVector
中把數據行標記為刪除。對于更新操作,會轉換為Delete + insert
操作,除了在DelVector
增加刪除標志外,還會寫入最新的數據,同時主鍵索引也會被更新。
-
對于讀: 由于歷史的數據在寫入的時候,已經被標志為了刪除,所以只需要讀取主鍵索引對應的信息就可以了,歷史數據不需要再進行合并了。并且當底層的數據掃描的時候,可以利用謂詞以及各種索引去減少掃描的數據量。因此查詢性能得到大大的提升。
注意:
- DelVector 是 Rowset 級別的
- 主鍵索引會記錄pk到rowsetId + segementId + rowId的映射關系