列式數據庫是以列相關存儲架構進行數據存儲的數據庫,主要適合與批量數據處理和即席查詢。相對應的是行式數據庫,數據以行相關的存儲體系架構進行空間分配,主要適合與小批量的數據處理,經常使用於聯機事務型數據處理。html
列式數據庫以行、列的二維表的形式存儲數據,可是卻以一維字符串的方式存儲,例如如下的一個表:數據庫
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;
這是一個簡化的說法。測試
列式數據庫的表明包括:Sybase IQ,ParAccel, Sand/DNA Analytics和 Vertica。大數據
傳統的行式數據庫,是按照行存儲的,維護大量的索引和物化視圖不管是在時間(處理)仍是空間(存儲)方面成本都很高。而列式數據庫偏偏相反,列式數據庫的數據是按照列存儲,每一列單獨存放,數據便是索引。只訪問查詢涉及的列,大大下降了系統I/O,每一列由一個線來處理,並且因爲數據類型一致,數據特徵類似,極大方便壓縮。優化
最後盧東明很務實的指出,沒有萬能的數據庫,Sybase IQ也並不是萬能,只不過給DBA們的工具箱裏提供更多的選擇,DBA需根據本身的應用場景自行選擇。spa
在數據倉庫領域,列式數據庫和傳統的行式數據庫有何差異呢?列式數據庫和行式數據庫的擁護者均認爲結合這兩種技術的混合數據庫是個不錯的想法。
行式數據庫擅長隨機讀操做,列式數據庫則更擅長大批量數據量查詢,而混合數據庫則試圖同時包含這兩種技術的優勢,在災難恢復環境中,數據要麼按列式存儲,要麼按行式存儲。
將來將是列式數據庫的天下,行數據庫和混合型數據庫都將漸漸消亡,緣由以下:數據增加速度很快,對存儲設備(主內存和SSD)的需求也將不斷上升,隨着主內存和SSD中壓縮列所佔百分比的提升,列式數據庫隨機讀的弱點反而變成了優勢,這樣列式數據庫不論是應付聯機事務處理,仍是大批量更新或大型報表須要執行的複雜查詢都能應付自如。對於更新操做而言,列式數據庫和行式數據庫在這方面已經沒有多大差距了,由於大部分更新操做只會影響到一行中的一到三列(字段),同時,大部分更新操做影響的是最近的數據,所以主內存/SSD緩存中數據會愈來愈多。對於插入和刪除操做而言,先在內存中快速更新索引,而後再寫入磁盤,這意味着在I/O密集型狀況下也不會有明顯的性能降低。對在線備份而言,按列存儲方法壓縮數據後備份時間窗口將會更短。
對今天的數據倉庫而言,列式數據庫的性能和傳統行數據庫相比,根本不在一個數量級上,列式數據庫已經獲得了普遍的承認和使用(Sybase IQ已經有十年曆史,也出現了一些新興列式數據庫公司,如Vertica),數據庫巨人Oracle也按捺不住,在其Exadata數據庫機中也加入了按列存儲選擇,IBM則提供了一個列式專用設備,它能夠肯定什麼數據該按列存儲,什麼數據該按行存儲,而後將事務分流到相應的設備。
列式數據庫從一開始就是面向大數據環境下數據倉庫的數據分析而產生,它跟行式數據庫相比固然也有一些前提條件和優缺點.
列式數據庫優勢:
極高的裝載速度 (最高能夠等於全部硬盤IO 的總和,基本是極限了)
適合大量的數據而不是小數據
實時加載數據僅限於增長(刪除和更新須要解壓縮Block 而後計算而後從新壓縮儲存)
高效的壓縮率,不只節省儲存空間也節省計算內存和CPU.
很是適合作聚合操做.
缺點:
不適合掃描小量數據
不適合隨機的更新
批量更新狀況各異,有的優化的比較好的列式數據庫(好比Vertica)表現比較好,有些沒有針對更新的數據庫表現比較差.
不適合作含有刪除和更新的實時操做.
一個常見的誤區認爲若是每次掃描較多行或者全列全表掃描的時候,行式數據庫比列式數據庫更有優點. 事實上這只是行式數據庫認識上的一個誤區,即認爲列式數據庫的主要優點在於其列分開儲存,而忽略了列式數據庫上面提到的其餘幾大特徵,這個纔是列式數據庫高性能的核心.
昨天裝了下兩個基於MySQL的數據倉庫,infindb和infobright,看了文檔發現它們都是列式數據庫,把40多M的數據導入infobright,沒想到數據文件只有1M多,壓縮比令我驚訝!
而後測試了下選擇某一列,在列上作計算,都比MyISAM和InnoDB要快,看了一些原理文檔,就本身模擬了一下,寫了個程序測試。
從內存中讀取效率很高,可是從磁盤中讀取(假設行式數據庫的索引在內存中)比行式數據庫要慢(開始在Twitter上說比行式快是程序寫錯了),不過我以爲仍是我設計上的問題,至少Infobright就比MyISAM/InnoDB快,列式應該也有其特殊的索引機制和緩存機制,例如每列分開存在不一樣的文件,這樣文件指針轉移會更快。
2010-02-04補充:採用了多個文件指針後,列式存儲明顯加速,若是給每一個列一個文件指針,效率會很是高,也能夠確定,若是每一個列單獨存儲一個文件,效率還會提升。如今文件中列式表讀取效率下降了4/5,接近行式表了。繼續優化還能提升。
更多參考 http://www.gemini5201314.net/bi/%E5%88%97%E6%95%B0%E6%8D%AE%E5%BA%93%E7%89%B9%E7%82%B9.html
http://zh.wikipedia.org/wiki/%E5%88%97%E5%BC%8F%E6%95%B0%E6%8D%AE%E5%BA%93