[toc]
[CMU15445] 05 - Database Storage 3
Database Workloads
- On-Line Transaction Processing(OLTP):每次只對(duì)整個(gè)數(shù)據(jù)庫(kù)的一小部分?jǐn)?shù)據(jù)進(jìn)行讀寫操作,通常寫操作多余讀操作,例如你在淘寶購(gòu)物車中添加商品捺萌,下訂單等
- On-Line Analytical Processing(OLAP):每次會(huì)對(duì)大量的數(shù)據(jù)進(jìn)行操作,基本全部為讀操作惭适,很少有寫操作拍摇,并且每次通常只會(huì)對(duì)一條記錄的幾個(gè)屬性操作
- Hybrid Transaction Analytical Processing(HTAP):同時(shí)兼顧了OLAP和OLTP的功能碗淌,屬于上述兩者的結(jié)合
Storage Models
存儲(chǔ)模型主要分為行存儲(chǔ)和列存儲(chǔ)
N-Ary Storage Model(NSM)
N-Ary將一條記錄的所有字段都連續(xù)的存儲(chǔ)在一起安拟,所以也叫行存儲(chǔ)蛤吓,適合用在OLTP的場(chǎng)景
優(yōu)點(diǎn):
- 由于整個(gè)記錄是存在一起的,可以快速的對(duì)一條記錄進(jìn)行插入糠赦,修改和刪除
- 對(duì)于需要用到整條記錄的查詢效率很高
缺點(diǎn):
- 對(duì)于一個(gè)需要查詢大量的數(shù)據(jù)会傲,但是只需要用到里面幾個(gè)字段的查詢锅棕,行存儲(chǔ)的效率很低
Decomposition Storage Model(DSM)
在DSM中,將不同記錄的相同屬性連續(xù)的存儲(chǔ)淌山,所以也叫列存儲(chǔ)裸燎,非常適合OLAP的應(yīng)用場(chǎng)景
對(duì)于DSM,一個(gè)問(wèn)題就是當(dāng)我們需要一整個(gè)記錄的時(shí)候怎么辦泼疑,通常會(huì)有以下方法
- Fixed-length Offsets
對(duì)于每一列的存儲(chǔ)德绿,所有的字段都是定長(zhǎng)的,所以查詢特定的字段可以通過(guò)偏移量來(lái)實(shí)現(xiàn)
- Embedded Tuple Ids
在每一個(gè)記錄中的每一個(gè)屬性多存儲(chǔ)一個(gè)Id王浴,單獨(dú)維護(hù)一個(gè)map脆炎,可以通過(guò)id映射到各個(gè)字段的位置梅猿,這樣做需要大量額外的存儲(chǔ)空間氓辣,所以一般不用這種
總結(jié)一下DSM的優(yōu)點(diǎn):
- 因?yàn)閿?shù)據(jù)是按列存儲(chǔ),對(duì)于特定查詢某列袱蚓,只需要讀入該部分的數(shù)據(jù)钞啸,減少了不必需要的I/O
- 因?yàn)槭前戳写鎯?chǔ),通常一列的數(shù)據(jù)都來(lái)自同樣的域(domain)喇潘,所以可以更好的支持查詢處理和壓縮
缺點(diǎn):
- 因?yàn)榱写鎯?chǔ)將一條記錄分開存儲(chǔ)体斩,所以對(duì)于整個(gè)記錄的查詢,插入颖低,更新絮吵,刪除等操作很慢
Database Compression
通常在一個(gè)數(shù)據(jù)庫(kù)中,性能的瓶頸總是卡在磁盤上忱屑,如果將數(shù)據(jù)壓縮蹬敲,這樣就可以一次從磁盤讀取更多的數(shù)據(jù),從而提高性能
數(shù)據(jù)庫(kù)的壓縮需要平衡壓縮率和速度莺戒,通常將數(shù)據(jù)壓縮的更小在處理時(shí)就需要花費(fèi)更多的時(shí)間伴嗡,所以大多數(shù)數(shù)據(jù)庫(kù)壓縮算法都會(huì)有一個(gè)較低的壓縮率來(lái)保證速度
數(shù)據(jù)庫(kù)壓縮算法有以下要求:
- 數(shù)據(jù)在壓縮后也應(yīng)該是定長(zhǎng)的字段,以便通過(guò)offset來(lái)索引
- 在需要對(duì)數(shù)據(jù)進(jìn)行操作時(shí)从铲,盡量延遲解壓縮的時(shí)間瘪校,也就是能不解壓縮就不解壓縮
- 壓縮一定是無(wú)損的
壓縮通常有不同的粒度,可以將整塊的數(shù)據(jù)壓縮(block-level)名段,也可以將每一行(tuple-level)阱扬,每一列(column-level),或者一行中的某一個(gè)字段(attribute-level)
下面介紹一些常用的壓縮算法:
1.Run-length Encoding
將相同的記錄壓縮成一個(gè)三元組(value,start,length)
在一個(gè)已經(jīng)排序好的數(shù)據(jù)上壓縮效果會(huì)更好
- Bit-packing Encoding
如果所有要存儲(chǔ)的值可以使用一個(gè)更小的數(shù)據(jù)類型來(lái)存儲(chǔ)伸辟,就換成更小的類型麻惶,例如一個(gè)int64字段,但是最大的值只有45自娩,就可以壓縮成8bit的存儲(chǔ)
- Bit-map Encoding
使用一個(gè)bit array來(lái)存儲(chǔ)值用踩,map的每一位表示一種不同的值渠退,通常用于值的種類較少的情況,例如性別
- Delta Encoding
對(duì)于時(shí)間脐彩,溫度之類的存儲(chǔ)碎乃,存儲(chǔ)他和上一個(gè)數(shù)據(jù)的差值,可以在這個(gè)的基礎(chǔ)上對(duì)數(shù)據(jù)壓縮惠奸,得到更小的數(shù)據(jù)
- Dictionary Encoding
將一個(gè)記錄拆成許多word的組合梅誓,建立一個(gè)字典來(lái)記錄word,建立一個(gè)id到word的映射佛南,在查詢時(shí)可以將word轉(zhuǎn)換為id梗掰,這樣就可以直接在壓縮的數(shù)據(jù)上進(jìn)行查詢,對(duì)于范圍查詢嗅回,可以將整個(gè)字典進(jìn)行排序