列式儲存和行式儲存的理解詳解

2021-10-09 13:46:30 字數 3004 閱讀 3508

叮嘟!這裡是小啊嗚的學習課程資料整理。好記性不如爛筆頭,今天也是努力進步的一天。一起加油高階吧!

列式儲存是指一列中的資料在儲存介質中是連續儲存的;

行式儲存是指一行中的資料在儲存介質中是連續儲存的。

簡單的說,你可以把列式資料庫認為是每一列都是乙個表,這個表只有一列,如果只在該列進行條件查詢,速度就很快。

那這兩種不同的儲存方式對資料的crud有什麼不同的影響呢

1。行資料庫適用於讀取出少行,多列的情況;

列資料庫相反,適用於讀取出少數列,多數行的情況。

2。列資料庫可以節省空間,如果某一行的某一列沒有資料,那在列儲存時,就可以不儲存該列的值。

傳統的行式資料庫將乙個個完整的資料行儲存在資料頁中。這種方式在大資料量查詢的時候會出現以下問題:

1、在沒有索引的情況下,會把一行全部查出來,查詢會使用大量io

2、雖然建立索引和物化檢視可以可以快速定位列,但是也需要花費大量時間

但是如果處理查詢時需要用到大部分的資料列,這種方式在磁碟io上是比較高效的。

一般來說,oltp(online transaction processing,聯機事務處理)應用適合採用這種方式。

乙個olap型別的查詢可能需要訪問幾百萬甚至幾十億個資料行,且該查詢往往只關心少數幾個資料列。例如,查詢今年銷量最高的前20個商品,這個查詢只關心三個資料列:時間(date)、商品(item)以及銷售量(sales amount)。商品的其他資料列,例如商品url、商品描述、商品所屬店鋪,等等,對這個查詢都是沒有意義的。

列式資料庫是將同乙個資料列的各個值存放在一起。插入某個資料行時,該行的各個資料列的值也會存放到不同的地方。例如上例中列式資料庫只需要讀取儲存著「時間、商品、銷量」的資料列,而行式資料庫需要讀取所有的資料列。因此,列式資料庫大大地提高了olap大資料量查詢的效率。當然,列式資料庫不是萬能的,每次讀取某個資料行時,需要分別從不同的地方讀取各個資料列的值,然後合併在一起形成資料行。因此,如果每次查詢涉及的資料量較小或者大部分查詢都需要整行的資料,列式資料庫並不適用

很多列式資料庫還支援列組(column group,bigtable系統中稱為locality group),即將多個經常一起訪問的資料列的各個值存放在一起。如果讀取的資料列屬於相同的列組,列式資料庫可以從相同的地方一次性讀取多個資料列的值,避免了多個資料列的合併。列組是一種行列混合儲存模式,這種模式能夠同時滿足oltp和olap的查詢需求。

由於同乙個資料列的資料重複度很高,因此,列式資料庫壓縮時有很大的優勢。例如,google bigtable列式資料庫對網頁庫壓縮可以達到15倍以上的壓縮率。另外,可以針對列式儲存做專門的索引優化。比如,性別列只有兩個值,「男」和「女」,可以對這一列建立位圖索引:

如上圖所示,「男」對應的點陣圖為100101,表示第1、4、6行值為「男」;「女」對應的點陣圖為011010,表示第2、3、5行值為「女」。如果需要查詢男性或者女性的個數,只需要統計相應的點陣圖中1出現的次數即可。另外,建立位圖索引後0和1的重複度高,可以採用專門的編碼方式對其進行壓縮。

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

自動索引

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

利於資料壓縮

利於壓縮有兩個原因。

一來你會發現大部分列資料基數其實是重複的,例如,因為同乙個 author 會發表多篇部落格,所以 author 列出現的所有值的基數肯定是小於部落格數量的,因此在 author 列的儲存上其實是不需要儲存部落格數量這麼大的資料量的;

二來相同的列資料型別一致,這樣利於資料結構填充的優化和壓縮,而且對於數字列這種資料型別可以採取更多有利的演算法去壓縮儲存。

列式儲存: 每一列單獨存放,資料即是索引。

只訪問涉及得列,如果我們想訪問單獨一列(比如name)會相當迅捷。

一行資料報含乙個列或者多個列,每個列一單獨乙個cell來儲存資料。

行式儲存: 把一行資料作為乙個整體來儲存。

簡單來講:

如果你大部分時間都是關注整張表的內容,而不是單獨某幾列,並且所關注的內容是不需要通過任何聚集運算的,那麼推薦使用行式儲存

列式儲存的話,比如你比較關注的都是某幾列的內容,或者有頻繁聚集需要的,通過聚集之後進行資料分析的表。

列式儲存應用場景

基於一列或比較少的列計算的時候

經常關注一張表某幾列而非整表資料的時候

資料表擁有非常多的列的時候

資料表有非常多行資料並且需要聚集運算的時候

資料表列裡有非常多的重複資料,有利於高度壓縮

行式儲存應用場景

關注整張表內容,或者需要經常更新資料

需要經常讀取整行資料

不需要聚集運算,或者快速查詢需求

資料表本身資料行並不多

資料表的列本身有太多唯一性的資料

ending!更多課程知識學習記錄隨後再來吧!

就醬,嘎啦!

列式儲存和行式儲存

行式儲存資料庫和列式儲存資料庫,隨著業務深入,技能增長,經常會碰到,今天來理解一下。列式儲存 clolumn based 和行式儲存 row based 都是相對於對方的,他們的區別是在磁碟的儲存方式不同,所以在讀寫資料時,方式不同,以至於他們的適用場景也都不同。列式儲存資料庫主要包括 hbase,...

列式儲存和行式儲存的區別

列式儲存 columnar or column based 是相對於傳統關係型資料庫的行式儲存 row basedstorage 來說的。簡單來說兩者的區別就是如何組織表 翻譯不好,直接抄原文了 row based storage stores atable in a sequence of row...

行式儲存與列式儲存

行式儲存與列式儲存 行式儲存 資料儲存以行為單位,儲存完一行就會跳到第二行 row based store。維護大量的索引,儲存成本比較高,不能做到線性擴充套件,對於隨機讀的效率高。最大的特點就是對事務的處理能力支援的非常好。行式儲存最大的優點是關係之間的解決方案,行式儲存實現了關係型資料庫,如果表...