1,行式數據庫
定義:存儲格式按照‘行’的方式把一行各個字段的數據存儲在一起,一行行連續存儲。
圖 1
把一條數據的信息寫到數據庫中;或者對一條數據中的某些字段進行修改;或者刪除整條數據一類的OLTP操作來說既直觀也高效。
但是,在行式數據庫上做一些報表、分析的時候,大家又發現這種存儲格式使用效率不高。例如:統計各省份的銷售額和利潤同比變化;按照部門統計業績完成情況等等,都是在其中某些字段上的操作,行式數據庫不分情況一律按照頁面讀取數據的方式,在只分析銷售額和利潤的時候,把每一份合同的其他信息,如客戶名稱,簽約時間,客戶經理等等也統統都讀了進來,浪費了大量寶貴的I/O。
數據庫界給出的第一個改進辦法就是“索引”,就像字典前面的目錄一樣,做到快速定位。但是隨着分析場景變得越來越復雜、變化越來越多,DBA們發現索引通常只能為一部分查詢、分析起到幫助的作用,如果想為一個企業級的BI系統中所有的查詢、分析場景做優化,無論是從組合的角度,還是從開銷的角度,都幾乎是不可能的,因為大量的索引所帶來的存儲空間的浪費以及為維護這些索引所帶來的時間的浪費都會以指數級別增長。
2,列式數據庫
定義:列式數據庫是將同一個數據列的各個值存放在一起。插入某個數據行時,該行的各個數據列的值也會存放到不同的地方。上例中列式數據庫只需要讀取存儲着“客戶名稱,簽約時間,客戶經理”的數據列,而行式數據庫需要讀取所有的數據列。因此,列式數據庫大大地提高了OLAP大數據量查詢的效率。當然,列式數據庫不是萬能的,每次讀取某個數據行時,需要分別從不同的地方讀取各個數據列的值,然后合並在一起形成數據行。因此,如果每次查詢涉及的數據量較小或者大部分查詢都需要整行的數據,列式數據庫並不適用。
圖 2
很多列式數據庫還支持列組(column group,Bigtable系統中稱為locality group),即將多個經常一起訪問的數據列的各個值存放在一起。如果讀取的數據列屬於相同的列組,列式數據庫可以從相同的地方一次性讀取多個數據列的值,避免了多個數據列的合並。列組是一種行列混合存儲模式,這種模式能夠同時滿足OLTP和OLAP的查詢需求。由於同一個數據列的數據重復度很高,因此,列式數據庫壓縮時有很大的優勢。例如,Google Bigtable列式數據庫對網頁庫壓縮可以達到15倍以上的壓縮率。另外,可以針對列式存儲做專門的索引優化。比如,性別列只有兩個值,“男”和“女”,可以對這一列建立位圖索引:
如圖3所示,“男”對應的位圖為100101,表示第1、4、6行值為“男”;“女”對應的位圖為011010,表示第2、3、5行值為“女”。如果需要查找男性或者女性的個數,只需要統計相應的位圖中1出現的次數即可。另外,建立位圖索引后0和1的重復度高,可以采用專門的編碼方式對其進行壓縮。
圖3
3,行式數據庫與列式數據庫的區別
http://fifiole.blog.163.com/blog/static/169459225201111610351428/
參考文獻:
http://book.2cto.com/201309/32718.html
http://fifiole.blog.163.com/blog/static/169459225201111610351428/