[toc]
[CMU15445] 05 - Database Storage 3
Database Workloads
- On-Line Transaction Processing(OLTP):每次只對整個(gè)數(shù)據(jù)庫的一小部分?jǐn)?shù)據(jù)進(jìn)行讀寫操作,通常寫操作多余讀操作,例如你在淘寶購物車中添加商品,下訂單等
- On-Line Analytical Processing(OLAP):每次會對大量的數(shù)據(jù)進(jìn)行操作,基本全部為讀操作,很少有寫操作,并且每次通常只會對一條記錄的幾個(gè)屬性操作
- Hybrid Transaction Analytical Processing(HTAP):同時(shí)兼顧了OLAP和OLTP的功能,屬于上述兩者的結(jié)合
Storage Models
存儲模型主要分為行存儲和列存儲
N-Ary Storage Model(NSM)
N-Ary將一條記錄的所有字段都連續(xù)的存儲在一起,所以也叫行存儲,適合用在OLTP的場景

優(yōu)點(diǎn):
- 由于整個(gè)記錄是存在一起的,可以快速的對一條記錄進(jìn)行插入,修改和刪除
- 對于需要用到整條記錄的查詢效率很高
缺點(diǎn):
- 對于一個(gè)需要查詢大量的數(shù)據(jù),但是只需要用到里面幾個(gè)字段的查詢,行存儲的效率很低

Decomposition Storage Model(DSM)
在DSM中,將不同記錄的相同屬性連續(xù)的存儲,所以也叫列存儲,非常適合OLAP的應(yīng)用場景

對于DSM,一個(gè)問題就是當(dāng)我們需要一整個(gè)記錄的時(shí)候怎么辦,通常會有以下方法
- Fixed-length Offsets
對于每一列的存儲,所有的字段都是定長的,所以查詢特定的字段可以通過偏移量來實(shí)現(xiàn)

- Embedded Tuple Ids
在每一個(gè)記錄中的每一個(gè)屬性多存儲一個(gè)Id,單獨(dú)維護(hù)一個(gè)map,可以通過id映射到各個(gè)字段的位置,這樣做需要大量額外的存儲空間,所以一般不用這種

總結(jié)一下DSM的優(yōu)點(diǎn):
- 因?yàn)閿?shù)據(jù)是按列存儲,對于特定查詢某列,只需要讀入該部分的數(shù)據(jù),減少了不必需要的I/O
- 因?yàn)槭前戳写鎯?,通常一列的?shù)據(jù)都來自同樣的域(domain),所以可以更好的支持查詢處理和壓縮
缺點(diǎn):
- 因?yàn)榱写鎯⒁粭l記錄分開存儲,所以對于整個(gè)記錄的查詢,插入,更新,刪除等操作很慢
Database Compression
通常在一個(gè)數(shù)據(jù)庫中,性能的瓶頸總是卡在磁盤上,如果將數(shù)據(jù)壓縮,這樣就可以一次從磁盤讀取更多的數(shù)據(jù),從而提高性能
數(shù)據(jù)庫的壓縮需要平衡壓縮率和速度,通常將數(shù)據(jù)壓縮的更小在處理時(shí)就需要花費(fèi)更多的時(shí)間,所以大多數(shù)數(shù)據(jù)庫壓縮算法都會有一個(gè)較低的壓縮率來保證速度
數(shù)據(jù)庫壓縮算法有以下要求:
- 數(shù)據(jù)在壓縮后也應(yīng)該是定長的字段,以便通過offset來索引
- 在需要對數(shù)據(jù)進(jìn)行操作時(shí),盡量延遲解壓縮的時(shí)間,也就是能不解壓縮就不解壓縮
- 壓縮一定是無損的
壓縮通常有不同的粒度,可以將整塊的數(shù)據(jù)壓縮(block-level),也可以將每一行(tuple-level),每一列(column-level),或者一行中的某一個(gè)字段(attribute-level)
下面介紹一些常用的壓縮算法:
1.Run-length Encoding
將相同的記錄壓縮成一個(gè)三元組(value,start,length)

在一個(gè)已經(jīng)排序好的數(shù)據(jù)上壓縮效果會更好

- Bit-packing Encoding
如果所有要存儲的值可以使用一個(gè)更小的數(shù)據(jù)類型來存儲,就換成更小的類型,例如一個(gè)int64字段,但是最大的值只有45,就可以壓縮成8bit的存儲

- Bit-map Encoding
使用一個(gè)bit array來存儲值,map的每一位表示一種不同的值,通常用于值的種類較少的情況,例如性別

- Delta Encoding
對于時(shí)間,溫度之類的存儲,存儲他和上一個(gè)數(shù)據(jù)的差值,可以在這個(gè)的基礎(chǔ)上對數(shù)據(jù)壓縮,得到更小的數(shù)據(jù)

- Dictionary Encoding
將一個(gè)記錄拆成許多word的組合,建立一個(gè)字典來記錄word,建立一個(gè)id到word的映射,在查詢時(shí)可以將word轉(zhuǎn)換為id,這樣就可以直接在壓縮的數(shù)據(jù)上進(jìn)行查詢,對于范圍查詢,可以將整個(gè)字典進(jìn)行排序
