目前數據庫存儲一張表格主要是行存儲(Row Storage)和列存儲(Column Storage)兩種存儲方式。
行存儲
行存儲將表格看作一個個記錄,每個記錄是一行。以包含訂單號、金額、下單時間 3 項的表為例,行存儲如下圖所示:
如上圖所示,在計算機中沒有真正的行的概念。行存儲本質就是數據一個接着一個排列,一行數據后面馬上跟着另一行數據。如果訂單表很大,一個磁盤塊(Block)存不下,那么實際上就是每個塊存儲一定的行數。 類似下圖這樣的結構:
行存儲更新一行的操作,往往可以在一個塊(Block)中進行。而查詢數據,聚合數據(比如求某個月份的訂單數),往往需要跨塊(Block)。因此,行存儲優點很明顯,更新快、單條記錄的數據集中,適合事務。但缺點也很明顯,查詢慢。
列存儲
列存儲中數據是一列一列存的。還以訂單表為例(包含訂單號、金額、下單時間),如下圖所示:
從圖中我們發現列存儲中,每個列的數據都聚集在一起,訂單號在一起、姓名在一起、時間在一起、金額也在一起。乍一看這樣的結構很低效,比如說你想取出第一條訂單,需要取第 1 列的第 1 個數據1001,然后取第 2 列的第 1 個數據小明,以此類推,需要 4 次磁盤讀取。特別是更新某一條記錄的時候,需要更新多處,速度很慢。那么列存儲優勢在哪里呢?優勢其實是在查詢和聚合運算。
在列存儲中同一列數據總是存放在一起,比如要查找某個時間段,很有可能在一個塊中就可以找到,因為時間是集中存儲的。假設磁盤塊的大小是 4KB,一條記錄是 100 字節, 那么 4KB 可以存 40 條記錄;但是存儲時間戳只需要一個 32 位整數,4KB 可以存儲 1000 個時間。更關鍵的是,我們可以把一片連續的硬盤空間通過 DMA 技術直接映射到內存,這樣就大大減少了搜索需要的時間。所以有時候在行存儲需要幾分鍾的搜索操作,在列存儲中只需幾秒鍾就可以完成。
說明:DMA技術是Direct Memory Access的縮寫。其意思是“存儲器直接訪問”。它是指一種高速的數據傳輸操作,允許在外部設備和存儲器之間直接讀寫數據,既不通過CPU,也不需要CPU干預。
總結
總結一下,行存儲、列存儲,最終都需要把數據存到磁盤塊。行存儲優點很明顯,更新快、單條記錄的數據集中,適合事務。但缺點也很明顯,查詢慢。列存儲的優勢其實是在查詢和聚合運算。之所以說行存儲適合事務,其實是相對的,是因為列存儲非常不適合事務。試想一下,你更新一個表的若干個數據,如果要在不同塊中更新,就可能產生多次更新操作。更新次數越多,保證一致性越麻煩。在單機環境我們可以上鎖,可以用阻塞隊列,可以用屏障……但是分布式場景中保證一致性(特別是強一致性)開銷很大。因此我們說行存儲適合事務,而列存儲不適合。
希望本文章對您有幫助,您的轉發、點贊是我的創作動力,十分感謝。
掃描下方二維碼關注微信公眾號,您會收到更多優質文章推送。