行儲存和列儲存的區別

2021-10-03 12:41:28 字數 1720 閱讀 2304

一、對比行儲存和列儲存的區別前,我們先來聊下背景。假設我們用mysql做了乙個商品訂單庫order, 如下

orderid

name

kind

price

kgtime1豬肉

肉類50

2.02020.01.012牛肉

肉類60

1.02020.01.013白菜

蔬菜61.02020.01.01

二、什麼叫行儲存?

舉個例子,按mysql的儲存設計,資料是按行排列到磁碟中的,比如第1行的全部欄位用/分開,連續寫入到磁碟中,"1/豬肉/肉類/50/2.0/2020.01.01"在order.idb檔案中的offset範圍為1201~1250。當使用者需要查詢第1筆訂單的**,語句為"select price from table where orderid=1",mysql必須把offset1201~1250都從磁碟中讀取出來,再從中挑選出price=50這個字段值返回。在資料量不多時,看起來並沒有什麼問題。

假設我們換個場景思考,我們是做電商的,每年產生1000億條訂單,每條訂單有50種屬性(50個字段),我們的分析師需要分析商品的平均**,這個時候如果用mysql,就需要把1000億條全部50個字段資料都從磁碟讀取,但是只取了其中price欄位使用,因為多讀取了49個字段的無用資料,磁碟和記憶體都會成為效能瓶頸,這個操作非常低效非常慢。這個時候,就需要引入列儲存的概念了。

三、什麼叫列儲存

列儲存,顧名思義就是按列儲存,還是上面的訂單案例,假設有這麼6個檔案:orderid.data,name.data,kind.data,price.data,kg.data,time.data,每個檔案按順序分別存了該字段的資料。如果要取第2行資料,可以從每個單獨的列檔案中獲取第2個數值,並將它們放到一起構成表的第2行。

orderid.data :"1/2/3"

name.data :"豬肉/牛肉/白菜"

kind.data :"肉類/肉類/蔬菜"

price.data :"50/60/6"

kg.data :"2.0/1.0/1.0"

time.data :"2020.01.01/2020.01.01/2020.01.01"

在這種場景下,假設我們的分析師需要分析商品的平均**,這個時候只需讀取price.data的全部內容,再做運算即可。這個操作相對mysql而言,非常高效,避免了讀取無用資料。

四、列儲存的其他優勢

由於資料是按列儲存的,每一列的資料型別其實是一致的。這個時候就可以引入資料壓縮技術,降低對磁碟吞吐量要求。比如對有範圍的整數進行點陣圖化,再進行遊程編碼。對於不用型別的資料,還有各種壓縮辦法。

五、資料排序

無論如何,資料都會複製到多台機器,避免一台機器發生故障時丟失資料。假設列儲存在生成副本時,使用不同的資料排序條件,這樣既能達到資料冗餘的功能,也能加速不同排序條件的資料分析。

六、寫操作

面對列儲存,壓縮、排序都非常有助於加速讀取查詢,但是它們的缺點是讓寫入更困難。像mysql這種行儲存,b-tree支援了原地更新方式。但對於壓縮的列儲存是不可能的,如果要在排序表的中間插入一行,不得不重寫所有的列檔案。有一種解決辦法是,借鑑lsm-tree的辦法,定期合併新插入資料和磁碟檔案。

參考《資料密集型應用系統設計》

原文出自:

end

行儲存和列儲存的區別

列儲存不同於傳統的關係型資料庫,其資料在表中是按行儲存的,列方式所帶來的重要好處之一就是,由於查詢中的選擇規則是通過列來定義的,因此整個資料庫是自動索引化的。按列儲存每個欄位的資料聚集儲存,在查詢只需要少數幾個欄位的時候,能大大減少讀取的資料量,乙個欄位的資料聚集儲存,那就更容易為這種聚集儲存設計更...

行儲存和列儲存的區別

行儲存和列儲存的區別 a.行儲存的寫入是一次完成,資料的完整性因此可以確定。列儲存需要把一行記錄拆分成單列儲存,寫入次數明顯比行儲存多。行儲存在寫入上占有很大的優勢 b.行儲存是在指定位置寫入一次,列儲存是將磁碟定位到多個列上分別寫入 行儲存在資料修改也是佔優的 c.行儲存通常將一行資料完全讀出,如...

行儲存和列儲存的區別

行儲存和列儲存的區別 列儲存不同於傳統的關係型資料庫,其資料在表中是按行儲存的,列方式所帶來的重要好處之一就是,由於查詢中的選擇規則是通過列來定義的。因此整個資料庫是自動索引化的。按列儲存每個欄位的資料聚集儲存,在查詢只需要少數幾個欄位的時候,能大大減少讀取的資料量,乙個欄位的資料聚集儲存,那就更容...