天天看點

什麼是列式存儲,一文秒懂

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

從資料存儲講起

我們最先接觸的資料庫系統,大部分都是行存儲系統。大學的時候學資料庫,老師讓我們将資料庫想象成一張表格,每條資料記錄就是一行資料,每行資料包含若幹列。是以我們對大部分資料存儲的思維也就是一個複雜一點的表格管理系統。我們在一行一行地寫入資料,然後按查詢條件查詢過濾出我們想要的行記錄。

大部分傳統的關系型資料庫,都是面向行來組織資料的。如 Mysql,Postgresql。近幾年,也越來越多傳統資料庫加入了列存儲的能力。雖然列存儲的技術在十幾年前就已經出現,卻從來沒有像現在這樣成為一種流行的存儲組織方式。

行存儲和列存儲,是資料庫底層組織資料的方式。(和文檔型、K-V 型,時序型等概念不在一個層次)

行存儲

行存儲系統以行的方式來組織資料。假設現在有以下 blog 資料(大學時老師布置系統課題作業總是讓我們做一個部落格系統,大概因為他們最先接觸的網際網路就是 BBS 吧):

什麼是列式存儲,一文秒懂
什麼是列式存儲,一文秒懂

行存儲将會以下列方式将資料存儲在磁盤上。我們可以思考一下,這樣的方式利于什麼樣的存儲?(此處停頓 5 秒思考一下)它利于資料一行一行的寫入,寫入一條資料記錄時,隻需要将資料追加到已有資料記錄後面即可。

行模式存儲适合 OLTP(Online Transaction Processing)系統。因為資料基于行存儲,是以資料的寫入會更快。對按記錄查詢資料也更簡單。

大部分同學會問,我們的做的系統不就是在為了這個嗎?是以我為什麼還需要列式存儲,而列式存儲又是什麼?

讓我們想象一種場景,現在不是想查詢 Bob 的部落格,我想統計 Bob 發表的部落格數,或是整個系統今天的部落格點贊數。如果是行存儲系統,資料庫将怎樣操作?(停頓思考 10 秒)

什麼是列式存儲,一文秒懂

如圖,想統計所有點贊數,首先需要将所有行資料讀入記憶體,然後對 like_num 列做 sum 操作,進而得到結果。我們假設磁盤一次可以讀取圖中 3 個方框的資料(實際需要按 byte 來讀取),那麼這個聚合計算需要 N(N=資料量)次磁盤通路。

這種經常需要通過大量資料集來聚合統計資料的需求其實是 OLAP 系統的常見行為。基于這個需求我們也可以明白為什麼這幾年列式存儲開始流行。因為資料,大資料,資料分析,也就是 OLAP(Online Analytical Processing)線上分析系統的需求增多了,資料寫入的事務和按記錄查詢資料都不是它的關注點,它關注的是資料過濾,統計。

列存儲

同樣是上面的示例資料,我們來看列式存儲是怎樣組織資料的。

什麼是列式存儲,一文秒懂
什麼是列式存儲,一文秒懂

如圖所示,列式存儲将每一列的資料組織在一起。可以思考一下這樣利于什麼呢?(停頓 5 秒)

是的,利于對于列的操作,如上面我們說到的統計所有 like_num 之和。其過程将如下:

什麼是列式存儲,一文秒懂

依然假設磁盤一次可以讀取 3 個方框的資料(實際按 byte 讀取)。可以看出按列存儲組織資料的方式,隻需要 1 次磁盤操作就可以完成。

在程式的世界裡,我們學會了,任何的選擇和傾向都是有代價的。空間換時間,時間換空間,一緻性可用性互相平衡等。選擇列式存儲必然也有不利的一面。首先就表現在資料寫入上。

什麼是列式存儲,一文秒懂

當一條新資料到來,需要将每一列存儲到對應的位置。這樣就需要多次寫磁盤操作。(當然真實的資料庫不會出現圖中”擠一擠“、”挪一挪“的情況,資料庫會将不同列資料組織在不同的地方;對于多次寫操作的問題,大部分存儲系統會通過緩沖來降低這種情況帶來的不足)

對比

什麼是列式存儲,一文秒懂

列存儲優勢

基于列模式的存儲,天然就會具備以下幾個優點:

  • 自動索引

因為基于列存儲,是以每一列本身就相當于索引。是以在做一些需要索引的操作時,就不需要額外的資料結構來為此列建立合适的索引。

  • 利于資料壓縮

利于壓縮有兩個原因。一來你會發現大部分列資料基數其實是重複的,拿上面的資料來說,因為同一個 author 會發表多篇部落格,是以 author 列出現的所有值的基數肯定是小于部落格數量的,是以在 author 列的存儲上其實是不需要存儲部落格數量這麼大的資料量的;二來相同的列資料類型一緻,這樣利于資料結構填充的優化和壓縮,而且對于數字列這種資料類型可以采取更多有利的算法去壓縮存儲。

最後

目前列存儲模式在很多分析型資料庫中都很常見。而且因為大資料分析型需求的增多,越來越多傳統的行存儲資料庫也加入了列存儲的模式,比如 Oracle 和 Sql Server 都有了列存儲的特性。

之前講的 Apache Druid 底層資料存儲就是基于列模式。有興趣的可以回顧一下。另外 HBase 是一個比較有代表性的列存儲模式資料庫。有時間可以來聊一聊 HBase 底層是如何存儲資料的。也可以講一講數字列的壓縮方式(大家也可以先思考一下可以如何壓縮數字列)。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/zhibo

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-04-09

本文作者:MageByte

本文來自:“掘金”,了解相關資訊可以關注“掘金”