rknfish

rknfish

i need more love
github

講座 #05:儲存模型與壓縮

參考投影片

參考筆記

Mermaid Loading...

資料庫工作負載#

OLTP#

OLTP:線上交易處理

快速讀取和更新小範圍數據的操作。

OLTP

OLAP#

OLAP:線上分析處理

用於支持複雜的分析操作,提供決策支持等。

image

HTAP#

混合事務 + 分析處理

一種新的工作負載,將 OLTP 和 OLAP 結合在一起。

OLTP OLAP HTAP


儲存模型#

N-Ary 儲存模型 (NSM)#

在 n-ary 的儲存模型中,DBMS 將包含所有屬性的元組連續地存儲在單獨的頁面中。

n-ary-model

對於 OLTP 來說非常理想。

優點:

  • 插入、更新、刪除非常快速
  • 對於需要整個元組的查詢非常友好

缺點:

  • 對於需要掃描整個表或只需要一個屬性的查詢非常不友好

image

分解儲存模型 (DSM)#

將每個元組中的每個屬性單獨分開進行存儲。

也可以稱為 “列存儲(column store)”。

對於只讀的 OLAP 操作非常友好,尤其是那些只需要掃描部分屬性的操作。

image

優點:

  • 減少 I/O 浪費
  • 更好地進行查詢和壓縮數據

缺點:

  • 對於單點修改、查詢更新等操作比較慢。

為了實現這種操作,通常有兩種操作方法。

  1. 為每個屬性設置固定的字長,這樣我們只需要獲得偏移量就可以準確查找到我們所需的數據。
  2. 一種更罕見的操作是,使用一個形如 (id : pos) 的元組來存儲值,表示第 id 的值存儲在 pos 位置上。

image

資料庫壓縮#

I/O 是非常耗時的,通常是整個數據庫的瓶頸,所以 DBMS 中廣泛使用壓縮算法來提高 DBMS 的性能。

通常我們需要在速度和壓縮率之間進行取捨。

壓縮粒度#

  • 塊級別
  • 元組級別(僅限 NSM)
  • 屬性級別
  • 列級別

Naive 壓縮#

使用 “通用” 壓縮算法通常也是一種解決方法。但一旦使用這種方法,DBMS 就不知道我們操作的數據是什麼,直到解壓縮完成。

提供的輸入:
→ LZO(1996 年)、LZ4(2011 年)、Snappy(2011 年)、Oracle OZIP(2014 年)、Zstd(2015 年)

image

為了提高速度,我們需要其他壓縮方法,即使在壓縮後,我們也有辦法加速獲取其中的信息。

image

列壓縮#

Run-Length 編碼(RLE)#

可以將一些連續出現在同一列上的值壓縮成一個形如 (value : pos : num) 的三元組。

其中:

  1. value 表示值
  2. pos 表示該值的起始位置
  3. num 表示該值重複的次數

image

不過該方法可能存在一些缺陷

image

經過轉換後

image

Bit-Packing 編碼#

一些數據對我們來說是非常冗余的,我們可以通過 Bit-Packing 的方式減少這些冗余。

image

int64 轉換為 int8 大大減少了所需的空間。

不過該方法存在一些缺陷,可能會存在部分信息不符合 int8 的情況。

因此,我們需要如下的方式進行存儲。

image

不過該方法只能在額外存儲信息較少的時候使用。

Bitmap 編碼#

當每個屬性的值較少時,我們可以使用 Bitmap 的方式進行存儲。

例如,只存在 F 和 M 兩種值時,我們就可以用 01 來表示是或不是。

image

Delta 編碼#

在許多情況下,例如室溫多少,我們的統計結果中可能存在密集的值在一定的範圍內。

因此,我們通過確定一個值後,往後的所有值都可以通過 delta 的形式存儲。

image

Incremental 編碼#

我們通常也可以通過取前綴 / 後綴的形式來獲得我們的最終結果。

image

字典編碼#

當一張表中可能存在多個值,且這些值存在於不同的地方時,我們就可以通過字典的形式得到這些值所在的位置。

image

這也是最常用的壓縮方法。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。