資料庫工作負載#
OLTP#
OLTP:線上交易處理
快速讀取和更新小範圍數據的操作。
OLAP#
OLAP:線上分析處理
用於支持複雜的分析操作,提供決策支持等。
HTAP#
混合事務 + 分析處理
一種新的工作負載,將 OLTP 和 OLAP 結合在一起。
儲存模型#
N-Ary 儲存模型 (NSM)#
在 n-ary 的儲存模型中,DBMS 將包含所有屬性的元組連續地存儲在單獨的頁面中。
對於 OLTP 來說非常理想。
優點:
- 插入、更新、刪除非常快速
- 對於需要整個元組的查詢非常友好
缺點:
- 對於需要掃描整個表或只需要一個屬性的查詢非常不友好
分解儲存模型 (DSM)#
將每個元組中的每個屬性單獨分開進行存儲。
也可以稱為 “列存儲(column store)”。
對於只讀的 OLAP 操作非常友好,尤其是那些只需要掃描部分屬性的操作。
優點:
- 減少 I/O 浪費
- 更好地進行查詢和壓縮數據
缺點:
- 對於單點修改、查詢更新等操作比較慢。
為了實現這種操作,通常有兩種操作方法。
- 為每個屬性設置固定的字長,這樣我們只需要獲得偏移量就可以準確查找到我們所需的數據。
- 一種更罕見的操作是,使用一個形如
(id : pos)
的元組來存儲值,表示第id
的值存儲在pos
位置上。
資料庫壓縮#
I/O 是非常耗時的,通常是整個數據庫的瓶頸,所以 DBMS 中廣泛使用壓縮算法來提高 DBMS 的性能。
通常我們需要在速度和壓縮率之間進行取捨。
壓縮粒度#
- 塊級別
- 元組級別(僅限 NSM)
- 屬性級別
- 列級別
Naive 壓縮#
使用 “通用” 壓縮算法通常也是一種解決方法。但一旦使用這種方法,DBMS 就不知道我們操作的數據是什麼,直到解壓縮完成。
提供的輸入:
→ LZO(1996 年)、LZ4(2011 年)、Snappy(2011 年)、Oracle OZIP(2014 年)、Zstd(2015 年)
為了提高速度,我們需要其他壓縮方法,即使在壓縮後,我們也有辦法加速獲取其中的信息。
列壓縮#
Run-Length 編碼(RLE)#
可以將一些連續出現在同一列上的值壓縮成一個形如 (value : pos : num)
的三元組。
其中:
value
表示值pos
表示該值的起始位置num
表示該值重複的次數
不過該方法可能存在一些缺陷
經過轉換後
Bit-Packing 編碼#
一些數據對我們來說是非常冗余的,我們可以通過 Bit-Packing 的方式減少這些冗余。
將 int64
轉換為 int8
大大減少了所需的空間。
不過該方法存在一些缺陷,可能會存在部分信息不符合 int8
的情況。
因此,我們需要如下的方式進行存儲。
不過該方法只能在額外存儲信息較少的時候使用。
Bitmap 編碼#
當每個屬性的值較少時,我們可以使用 Bitmap 的方式進行存儲。
例如,只存在 F 和 M 兩種值時,我們就可以用 01 來表示是或不是。
Delta 編碼#
在許多情況下,例如室溫多少,我們的統計結果中可能存在密集的值在一定的範圍內。
因此,我們通過確定一個值後,往後的所有值都可以通過 delta 的形式存儲。
Incremental 編碼#
我們通常也可以通過取前綴 / 後綴的形式來獲得我們的最終結果。
字典編碼#
當一張表中可能存在多個值,且這些值存在於不同的地方時,我們就可以通過字典的形式得到這些值所在的位置。
這也是最常用的壓縮方法。