什麼是列式儲存資料庫

2021-09-29 12:46:34 字數 3180 閱讀 8347

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

傳統的行儲存和列儲存的區別

1、資料是按行儲存的 

2、沒有索引的查詢使用大量i/o 

3、建立索引和物化檢視需要花費大量時間和資源 

4、面對查詢的需求,資料庫必須被大量膨脹才能滿足效能需求

1、資料按列儲存–每一列單獨存放 

2、資料即是索引 

3、只訪問查詢涉及的列–大量降低系統io 

4、每一列由乙個線索來處理–查詢的併發處理 

5、資料型別一致,資料特徵相似–高效壓縮

什麼是列式資料庫?可能大家也才到了,既然有列式資料庫,那麼肯定就有行式的嘍!確實是這樣的。也許大多數人並不了解資料庫儲存模型(storage model)和資料庫的資料模型(data model),不過對上層是使用者也沒多大關係。不過我們現在講的列式和行式就是指資料庫的storage model,而他們支援同樣的data schema,即對data model感知不到storage model的實現區別。 

乙個資料庫的data model約定可以進行上層資料操作,而storage model決定這些操作的效能。比如,no sql資料庫使用的是data model是key-value,而儲存模型有map結構實現,也可以由tree結構實現。而對於sql資料庫,其資料模型是一張二維表,而至於怎麼儲存這張二維表,很容易就可以想到可以按行儲存和按列儲存。按行儲存就是我們現在常見操作型資料庫,而是最大眾的資料庫,比如mysql、oracle、……等等你所知道大部分資料庫。而按列儲存的資料庫現在也是很有名,比如hive、vertica、druid、infobright等。

先讓讓我們想象關於二維表我們有哪些操作?—— select、update、delete和insert。這些操作都會需要找到相應的位置,所以這些操作的基礎都是search。 

而基本的演算法都是即從時間考慮也是從空間考慮的。我們開始具體舉個例子。

在資料庫儲存作為實際的一堆儲存在磁碟上的檔案,在設計不得不考慮磁碟的特性。一般的磁碟特性,其實所有的儲存都有乙個特性就是對於locality良好的訪問效能是隨機訪問的好幾倍。我們現在把一塊想像成一組固定大小的塊,如圖: disk logic model 而檔案的內容實際會被分開按照磁碟邏輯塊來儲存,資料庫主要任務就是怎麼組織這些邏輯塊來取得更好的讀取效能和便捷性。 

在不考慮索引的情況下,所有的磁碟讀取都是順序讀取,這意味了要查詢乙個東西,都需要掃瞄全表或者部分表。很直觀的道理,讀取的效能就是取決於掃瞄的範圍。範圍越大,速度當然越慢。 

我們先假設我們有一堆如下的資料:

rowid

empid

lastname

firstname

salary

00110

smith

joe40000

00212

jones

mary

50000

00311

johnson

cathy

44000

00422

jones

bob55000

好現在我們開始讓磁碟裡塞,假設我們的磁碟塊只能容下5個字段(抽象的,假設我們的這些欄位的大小都一樣),因為我們是按找行優先的,所以結果就如下: 

於是當我們要找jones的所有資訊的工資時候,我們會依次從第一塊磁碟塊直到掃瞄到最後(為什麼要掃到最後,因為是在找全部叫jones的資訊,所以不掃都最後都不能確定是否會遺漏)。一共需要掃4塊,然後取出其第二塊和第四塊資訊,找出其工資的資訊。

其實基於行式儲存,對於where語句處理都需要處理全表。對於磁碟的不停seek,速度就可想而知。當然一般資料庫為了應對這種全資料掃瞄,找到了建立索引的方法。而索引就是對某個或者某些欄位的組合的資訊,即取出資料的部分資訊,以減少每次掃瞄從全表到部分資訊的掃瞄的過渡。

這種查詢方式很適合於一次取出乙個行資料,而對於日常應用系統來說這種方式是非常合適的,因為我們設計應用的時候都是針對乙個事務,而我們會把乙個事務所有屬性儲存成一行,使用的時候也是有很大的概率涉及到整行的資訊,很利於做快取。還比如我們經常使用的那些經典sql 語句:

select * from user where id = 1001;

select id, user_name, email, address, gender, ... from user where id = 1001;

!!還敢不敢列出些更多的字段!!

而列儲存就是下圖這種按列優先儲存。為了方便我們每塊只儲存了乙個一列,沒有存滿。 

這下我們再考慮上面的查詢所有jones的工資,這下我們只掃瞄第三個磁碟塊,找出jones都再那些行,然後根據查出來的行號,直接去第五塊磁碟(這塊對應的式salary列)找出第

二、四行的資料,然後輸出。一共2次seek。大大小於row-oriented的4次。

這種查詢方式的前提就是你就需要這列資料就行了,其前提假設就是查詢基本不會使用這個行的其他列資料。顯然這種假設對於日常作業系統的圍繞著乙個主題進行的活動是不合適旳。但是卻在分析型資料大顯身手。

列式的另一大優勢是壓縮。因為列的天然凝聚性(比如上面的兩個jones就可以壓縮成乙個)大大強與行,所以列式儲存可以有很高的壓縮比,這個進一步使使用的磁碟的數量減少,因為使用的磁碟塊少,進一步減少了需要掃瞄的次數。這方面很利於加快查詢速度,但是因為解壓縮也是耗時耗記憶體的過程,所以壓縮的控制也是需要乙個定平衡點。

從上面的例子可以明顯看出列式資料庫在分析需求(獲取特點——每次查詢幾個維度,通常是)時候,不僅搜尋時間效率佔優勢,其空間效率也是很明顯的。特別是針對動輒按t計算的資料量來說,在分布式環境中能進行壓縮處理能節省寶貴的內部頻寬,從而提高整個計算任務效能。

什麼是行式資料庫,什麼是列式資料庫

資料庫以行 列的二維表的形式儲存資料,但是卻以一維字串的方式儲存,例如以下的乙個表 empid lastname firstname salary 1smith joe40000 2jones mary 50000 3johnson cathy 44000 這個簡單的表包括員工 empid 姓名字段...

clickhouse 列式儲存資料庫介紹

clickhouse介紹 俄羅斯最大的搜尋公司yandex,在clickhouse的配置檔案中我們也會看到yandex的影子。相對行式資料庫,像mysql oracle sqlserver等都是行式儲存,是把同一行的資料放到相鄰同一資料塊種,而列式儲存是把同一列的資料放到相鄰同一資料塊種,這樣在進行...

列式資料庫

列式資料庫是以列相關儲存架構進行資料儲存的資料庫,主要適合於批量資料處理和即席查詢。相對應的是行式資料庫,資料以行相關的儲存體系架構進行空間分配,主要適合於小批量的資料處理,常用於聯機事務型資料處理。資料庫以行 列的二維表的形式儲存資料,但是卻以一維字串的方式儲存,例如以下的乙個表 empid la...