[CMU15445] 04 - Database Storage 2
Log_Structured Storage
基于日志的存儲比起原來的面向tuple的存儲,只允許append新內(nèi)容而不允許修改舊的內(nèi)容飘庄,對于一個page來說购撼,基于日志的存儲就一直不斷地append append的添加新內(nèi)容谴仙,當日志大小超過一個page的大小晃跺,此時它便被寫入磁盤毫玖。對于刪除一個元素,就相當于將該元素的值置為一個已刪除的標記烹玉。
比起tuple-oriented的存儲阐滩,log-structure存儲提高的寫性能,主要原因如下:
- append only继效,使用順序I/O代替了原來的隨機I/O
- 所有寫入的數(shù)據(jù)都是inmutable的
對于讀來說瑞信,log_structure先從內(nèi)存中的page開始尋找穴豫,如果沒找到,就會從新到舊在磁盤上的page中尋找潘鲫,為了避免這種linear scan肋杖,通常會維護存儲元素的最新日志的索引状植,以便快速確定他在塊中哪個位置怨喘。
因為不斷地append,所以日志會變得越來越大肉拓,需要按照一定策略對這些文件進行合并梳庆,也就是對于一個相同的key卑惜,只保留它最新的一條log露久,這樣merge結(jié)束后欺栗,一個文件中一個key就只有一個記錄了迟几,同時在merge的時候,會將key排序后merge梯啤,這樣的數(shù)據(jù)結(jié)構(gòu)叫做 Sorted String Tables (SSTables)
Data Representation
float/real vs numeric/decimal
數(shù)據(jù)庫在存儲數(shù)字時因宇,如果要求精確就應該使用 decimal/numeric 這些類型察滑,這些類型在底層并不是當作數(shù)字直接存儲的修肠,所以對他們做運算比較慢,而如果不要求很精確饲化,就可以使用 float/real 類型吗伤,這些都是近似值但是運算起來很快。
large values
如果一個tuple的某個字段數(shù)據(jù)很大超過了一個頁的大小巢块,就需要另外存儲這個字段族奢,通常有兩種方法丹鸿,兩者的區(qū)別在于數(shù)據(jù)是否由數(shù)據(jù)庫直接管理:
- overflow pages
使用額外的溢出頁來存儲數(shù)據(jù),原來字段的內(nèi)容變成指向溢出頁的指針
- external storage
數(shù)據(jù)存儲在外部的文件中廊敌,原來的字段保存指向外部文件的uri,適用于很大的文件疼进,例如視頻秧廉,很長的文章等,缺點是這個文件并不由數(shù)據(jù)庫管理嚼锄,會有concurrence等問題