說到數據庫存儲技術的基礎,就要了解企業應用的數據特性以及面臨的瓶頸。
1.企業應用的數據特性
- 事件產生數據
以快遞追蹤為例,信息讀取過程包括當前讀取操作的地點、時間戳、當前所處的業務流程(如收件、打包、運送)以及其他詳細信息。當然,對網絡游戲活動數據的分析就更為復雜。每個事件數據的數據集較小(Byte/KB)而每個實體可產生多個事件。
- 結構化/非結構化數據的結合
結構化數據有標准的格式存儲即可被計算機自動處理。非結構化數據是不具有特定的數據解析模型,不能被計算機自動處理的數據,例如視頻、圖片與任何非結構化的文本信息。以患者數據為例,性別、年齡是結構化的,而病史、診斷數據是非結構化的。企業要對非結構化數據進行專項處理,以達到高效的搜索。
2.數據庫的瓶頸
現代的企業偏向“數據導向”。企業要處理人與機器時時刻刻產生的大量數據來支撐決策,為此要將不同數據源的數據整合;企業要進行交互式決策,為此要對數據實時分析。數據傳輸的效率受限於CPU總線,而通過並行處理可超越總線速率。磁盤用於數據的備份和歸檔,不是線上服務性能的關注點。因此,內存的訪問成為數據庫的新瓶頸。
3.瓶頸的改善方法
當然,分庫可以改善內存瓶頸,但改善瓶頸的本質是減少對內存的訪問。我們應該盡可能減少數據的表示位數,這樣既能減少內存占用又能減少內存的訪問。同時,在執行訪問時也要精打細算,只訪問被用到的列。
減少數據表示位數的最基本思路就是字典編碼,既簡單又好用,也是編碼列壓縮技術的基礎。
4.字典編碼
字典編碼以列為單元進行操作,通過簡單的轉換將不同的值替換為不同的整數值(短整數優先),將長文本值壓縮為短整數值,因此並沒有改變表的規模。通常情況下,企業數據的熵較低,即數據的重復度大,因此壓縮效果較為理想。以性別列壓縮為例:性別列僅包含兩個值,若通過"m", "f"表示,那么需要1byte.假設全世界有70億人口,那么需要70億*1byte約為6.52GB. 如果使用字典壓縮,1位足夠表達相同信息,需要70億)1bit=0.81GB, 其中字典需要2*1字節=2字節。壓縮比例=未壓縮大小/壓縮大小約為8.
通常情況下,姓名、國家、生日等文本數據均可通過字典編碼獲得10~20倍的壓縮比例。
5.排序字典
上述字典編碼的全量掃描時間為O(n), 如過將字典加以排序,利用二分法的字典檢索時間僅為O(lon(n)). 一般情況下,我們希望字典既精煉又冗余,因為這樣的優化要付出代價:新字的加入導致字典重排序,若新字不在字典末尾,數據表也要更新,即新字后面的字所對應的值均要向后位移。因此,對於國家、生日等“可數可列”(可窮舉)的列采用字典編碼即可獲得更好的查找速度,又幾乎不會擔心字典產生變動。
參考書籍
[1]. A Course in In-Memory Data Management: The Inner Mechanics of In-Memory Databases. Hasso Plattner. 2012