您好,登錄后才能下訂單哦!
數據庫常用的壓縮算法有哪些,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
數據庫常用的壓縮算法怎么解讀
最早的列式數據庫Sybase IQ 使用的是一種Decomposed 模型, 簡單的將每一列分開,然后用rowid 來標記每一行的位置。
后來的列式數據庫基本上都不用rowid 來標記每一列的位置, 并且對于每一個Block 的數據一定是先計算那一列具有最高選擇性(唯一值最少),然后依次以選擇性來排序從而可以不使用rowid 標記行的位置。
而由于排序之后相同的值在一起的機會更大,所以壓縮率也就比普通的簡單列儲存(也即上面介紹的Decompose模型) 的壓縮率大很多倍。
常見的列式數據庫壓縮算法有如下幾種:
當 數據排序之后相同的值肯定在一起,并且在同一個Block 里面一個值壓縮后只會出現一遍。 注意這里的排序并不是指按照值大小的排序,比如5>1 , B>A 這種,而是值將相同的值聚在一起,按出現的頻率進行排序( 類似group by 之后order by 每一個字段)。 比如:
WWWWWWWWWWWWWWBBBBBBBBBZZZZZA1
壓縮后就成為
W14B9Z5A1
按照出現的頻率進行先后順序排序。 只要計算每一個數值出現的次數就可以計算出當前數值的起始rowid 和次數了。 這比較有利于進行in , not in , group 等sql 操作。
將每一個出現的值寫在Block 的頭部, 然后用1 和 0 來表示有或者沒有。 這種算法要求每一個出現的值都必須具有非常高的選擇性并且不同值之間差別不能大到幾十倍的差距,而不像Run Length Encoding 只需要整體的選擇性比較高就可以了。
數據庫常用的壓縮算法怎么解讀
行式數據庫的BitMap Index 一般是一個整體的文件塊(如果是local partition 當然也是local index)。 列式數據庫的組織形式都是按每一個block 每一個block 的方式組織,它的bitmap index 出現的值都是按當前block 出現的所有值組織的。 某些列式數據庫會有一些變種: 比如在1和 0 之間還加入Run length encoding 繼續壓縮或者加入Null Compression, 用來排除空值比較多的情況。
Data Dictionary
行 式數據庫的一般都是選用的這種方式,將Block 常用的值放在block 頭部, 實際出現這個值的地方用標記代替,行式數據庫里面一般會有一個壓縮級別的東西,壓縮級別越高壓縮時間越長,收益越小,解壓縮時間不變。 列式數據庫的Data Dictionary 壓縮也是在block 的頭部存放壓縮之前的實際值,但是與行式數據庫不同的是列式數據庫會存放所有值,不管這個值即使只出現了一次,這樣便于它在不可見索引和延遲物化方面可以 不解壓數據就能進行普通操作。
Delta Compression
delta壓縮適合在那些數據前半部分相同的情況下使用,比如很大的整數和長的有規律的字符串。 Delta 壓縮會記錄一個基礎值,然后在之后的每一個值只使用他們差別的部分,比如電話號碼,URL,地址,IP 之類的。
LZO
LZO或者其他類似的二進制壓縮算法gzip,zip,rar,7zip。bzip等等在列數據庫里面也有使用,但是只適用于連讀取都非常少的歸檔數據(每次只讀非常少量的行數)和大段的文本(網頁索引之類的)。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。