原文:http://www.penglixun.com/tech/database/column-oriented_dbms_analyse.htmlhtml
這些天看數據倉庫的內容,發現一個新內容——列式存儲。曾經有想過把數據庫行列轉置做成索引,不過沒有深想,沒想到列式數據庫已經開始發展起來了。
首先看下WIKI上對列式數據庫的解釋:web
列式數據庫是以列相關存儲架構進行數據存儲的數據庫,主要適合與批量數據處理和即席查詢。相對應的是行式數據庫,數據以行相關的存儲體系架構進行空間分配,主要適合與小批量的數據處理,經常使用於聯機事務型數據處理。
數據庫以行、列的二維表的形式存儲數據,可是卻以一維字符串的方式存儲,例如如下的一個表:
EmpId Lastname Firstname Salary
1 Smith Joe 40000
2 Jones Mary 50000
3 Johnson Cathy 44000
這個簡單的表包括員工代碼(EmpId), 姓名字段(Lastname and Firstname)及工資(Salary).
這個表存儲在電腦的內存(RAM)和存儲(硬盤)中。雖然內存和硬盤在機制上不一樣,電腦的操做系統是以一樣的方式存儲的。數據庫必須把這個二維表存儲在一系列一維的「字節」中,又操做系統寫到內存或硬盤中。
行式數據庫把一行中的數據值串在一塊兒存儲起來,而後再存儲下一行的數據,以此類推。
1,Smith,Joe,40000;2,Jones,Mary,50000;3,Johnson,Cathy,44000;
列式數據庫把一列中的數據值串在一塊兒存儲起來,而後再存儲下一列的數據,以此類推。
1,2,3;Smith,Jones,Johnson;Joe,Mary,Cathy;40000,50000,44000;
這是一個簡化的說法。數據庫
昨天裝了下兩個基於MySQL的數據倉庫,infindb和infobright,看了文檔發現它們都是列式數據庫,把40多M的數據導入infobright,沒想到數據文件只有1M多,壓縮比令我驚訝!
而後測試了下選擇某一列,在列上作計算,都比MyISAM和InnoDB要快,看了一些原理文檔,就本身模擬了一下,寫了個程序測試。
從內存中讀取效率很高,可是從磁盤中讀取(假設行式數據庫的索引在內存中)比行式數據庫要慢(開始在Twitter上說比行式快是程序寫錯了),不過我以爲仍是我設計上的問題,至少Infobright就比MyISAM/InnoDB快,列式應該也有其特殊的索引機制和緩存機制,例如每列分開存在不一樣的文件,這樣文件指針轉移會更快。
2010-02-04補充:採用了多個文件指針後,列式存儲明顯加速,若是給每一個列一個文件指針,效率會很是高,也能夠確定,若是每一個列單獨存儲一個文件,效率還會提升。如今文件中列式表讀取效率下降了4/5,接近行式表了。繼續優化還能提升。緩存