自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么 OLAP需要列式存儲(chǔ)

存儲(chǔ) 存儲(chǔ)軟件
為什么這么設(shè)計(jì)(Why’s THE Design)是一系列關(guān)于計(jì)算機(jī)領(lǐng)域中程序設(shè)計(jì)決策的文章,我們?cè)谶@個(gè)系列的每一篇文章中都會(huì)提出一個(gè)具體的問(wèn)題并從不同的角度討論這種設(shè)計(jì)的優(yōu)缺點(diǎn)、對(duì)具體實(shí)現(xiàn)造成的影響。

[[381347]]

為什么這么設(shè)計(jì)(Why’s THE Design)是一系列關(guān)于計(jì)算機(jī)領(lǐng)域中程序設(shè)計(jì)決策的文章,我們?cè)谶@個(gè)系列的每一篇文章中都會(huì)提出一個(gè)具體的問(wèn)題并從不同的角度討論這種設(shè)計(jì)的優(yōu)缺點(diǎn)、對(duì)具體實(shí)現(xiàn)造成的影響。如果你有想要了解的問(wèn)題,可以在文章下面留言。

ClickHouse 是最近比較熱門(mén)的用于在線分析處理的(OLAP)[^1]數(shù)據(jù)存儲(chǔ),與我們常見(jiàn)的 MySQL、PostgreSQL 等傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)相比,ClickHouse、Hive 和 HBase 等用于在線分析處理(OLAP)場(chǎng)景的數(shù)據(jù)存儲(chǔ)往往都會(huì)使用列式存儲(chǔ)。

olap-oltp-databases

圖 1 - OLAP 和 OLTP

對(duì)數(shù)據(jù)庫(kù)稍有了解的讀者都知道,在線事務(wù)處理(Online Transaction Processing、OLTP)[^2]和在線分析處理(Online Analytical Processing、OLAP)是數(shù)據(jù)庫(kù)最常見(jiàn)的兩種場(chǎng)景,這兩種場(chǎng)景不是唯二的兩種,從中衍生出來(lái)的還有混合事務(wù)分析處理(Hybrid Transactional/Analytical Processing、HTAP)[^3]等概念。

在線事務(wù)處理是最常見(jiàn)的場(chǎng)景,在線服務(wù)需要為用戶(hù)實(shí)時(shí)提供服務(wù),提供服務(wù)的過(guò)程中可能要查詢(xún)或者創(chuàng)建一些記錄;而在線分析處理的場(chǎng)景需要批量處理用戶(hù)數(shù)據(jù),數(shù)據(jù)分析師會(huì)根據(jù)用戶(hù)產(chǎn)生的數(shù)據(jù)分析用戶(hù)行為和畫(huà)像、產(chǎn)出報(bào)表和模型。

標(biāo)題中提到的列式存儲(chǔ)與傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的行式存儲(chǔ)相對(duì)應(yīng),如下圖所示,其中行式存儲(chǔ)以數(shù)據(jù)行或者實(shí)體為邏輯單元管理數(shù)據(jù),數(shù)據(jù)行的存儲(chǔ)都是連續(xù)的,而列式存儲(chǔ)以數(shù)據(jù)列為邏輯單元管理數(shù)據(jù),相鄰的數(shù)據(jù)都是具有相同類(lèi)型的數(shù)據(jù)。

圖 2 - 行式存儲(chǔ)和列式存儲(chǔ)

既然我們已經(jīng)了解了標(biāo)題中提到的兩個(gè)概念:OLAP 和列式存儲(chǔ),那么接下來(lái)將從以下兩個(gè)方面分析為什么列式存儲(chǔ)更適合 OLAP 的場(chǎng)景。

  • 列式存儲(chǔ)可以滿(mǎn)足快速讀取特定列的需求,在線分析處理往往需要在上百列的寬表中讀取指定列分析;
  • 列式存儲(chǔ)就近存儲(chǔ)同一列的數(shù)據(jù),使用壓縮算法可以得到更高的壓縮率,減少存儲(chǔ)占用的磁盤(pán)空間;

按需讀取

在線服務(wù)需要應(yīng)對(duì)用戶(hù)發(fā)起的增刪改查需求,雖然查詢(xún)的需求往往都是寫(xiě)入請(qǐng)求的幾倍、甚至幾十倍,但是寫(xiě)操作帶來(lái)的負(fù)責(zé)一致性問(wèn)題成為了在線服務(wù)數(shù)據(jù)存儲(chǔ)不得不解決的問(wèn)題,MySQL 和 PostgreSQL 等使用關(guān)系型數(shù)據(jù)庫(kù)提供的事務(wù)可以提供很好的方案。

正是因?yàn)?OLTP 場(chǎng)景中大多數(shù)的操作都是以記錄作為單位的,所以將經(jīng)常被同時(shí)使用的數(shù)據(jù)相鄰存儲(chǔ)也是很符合邏輯的,但是如果我們將 MySQL 等數(shù)據(jù)庫(kù)用于 OLAP 場(chǎng)景,最常見(jiàn)的查詢(xún)也可能需要遍歷整張表中的全部數(shù)據(jù)。

圖 3 - 在行式存儲(chǔ)獲取特定列

如上圖所示,當(dāng)我們僅需要獲取上表中年齡的分布時(shí),也仍然需要讀取表中的全部數(shù)據(jù)并在內(nèi)存中丟棄不需要的數(shù)據(jù)行,其中黃色部分都是我們不關(guān)心的數(shù)據(jù),這浪費(fèi)了大量的 I/O 和內(nèi)存資源。雖然我們可以使用輔助索引解決這些問(wèn)題,但是對(duì)于 OLAP 中常見(jiàn)的幾十列甚至上百列的寬表就捉襟見(jiàn)肘了。

列式存儲(chǔ)會(huì)按列存儲(chǔ)數(shù)據(jù),這也意味著在讀取數(shù)據(jù)表中的特定列時(shí),我們只需要找到相應(yīng)內(nèi)存空間的起始位置,然后讀取這片連續(xù)的內(nèi)存空間就可以獲得關(guān)心的全部數(shù)據(jù)。

圖 4 - 在列式存儲(chǔ)獲取特定列

哪怕在幾百列的大表中找到幾個(gè)特定列也不需要遍歷整張表,只需要找到列的起始位置就可以快速獲取相關(guān)的數(shù)據(jù),減少了 I/O 和內(nèi)存資源的浪費(fèi),這也是為什么面向列的存儲(chǔ)系統(tǒng)更適合在 OLAP 的場(chǎng)景中使用。

數(shù)據(jù)壓縮

因?yàn)榱惺酱鎯?chǔ)將同一列的數(shù)據(jù)存儲(chǔ)在一起,所以使用壓縮算法可以得到更高的壓縮率,減少存儲(chǔ)占用的磁盤(pán)空間。壓縮算法的基本原理其實(shí)很簡(jiǎn)單,它使用基于特定規(guī)則的數(shù)據(jù)表示原數(shù)據(jù),如下所示的字符串中包含連續(xù)的相同字符,我們使用最符合直覺(jué)的壓縮算法就可以減少字符串的長(zhǎng)度:

圖 5 - 簡(jiǎn)單的壓縮算法

上圖中所有的黃色方塊表示前面字符串的重復(fù)次數(shù),這種簡(jiǎn)單的壓縮策略可以在保證無(wú)損的情況下將字符串的長(zhǎng)度壓縮 33%,然而壓縮率是由壓縮算法和數(shù)據(jù)的特性共同決定的。與面向行的數(shù)據(jù)存儲(chǔ)相比,面向列的數(shù)據(jù)存儲(chǔ)會(huì)將相同類(lèi)型的數(shù)據(jù)就近存儲(chǔ),這也給壓縮算法的提供了更多發(fā)揮的空間。

雖然壓縮算法實(shí)際上是一種使用 CPU 時(shí)間換取 I/O 時(shí)間和空間的策略,但是在多數(shù)情況下,這種生意都是穩(wěn)賺不賠的。壓縮算法通過(guò)減少數(shù)據(jù)的大小、減少磁盤(pán)的尋道時(shí)間提高 I/O 的性能、減少數(shù)據(jù)的傳輸時(shí)間并提高緩沖區(qū)的命中率,節(jié)省的 I/O 時(shí)間可以輕易補(bǔ)償它帶來(lái)的 CPU 額外開(kāi)銷(xiāo)[^4]。

總結(jié)

在線分析處理的場(chǎng)景雖然一直都存在,不過(guò)隨著數(shù)字化浪潮的演進(jìn),我們也只是在最近才采集到了海量的用戶(hù)數(shù)據(jù)。因?yàn)檫^(guò)去的系統(tǒng)無(wú)法滿(mǎn)足今天海量數(shù)據(jù)的分析和處理需求,所以才出現(xiàn)了為細(xì)分場(chǎng)景設(shè)計(jì)的系統(tǒng),面向列的存儲(chǔ)系統(tǒng)也因?yàn)樗囊韵绿匦栽? OLAP 的場(chǎng)景中煥發(fā)了光彩:

  • 列式存儲(chǔ)可以滿(mǎn)足快速讀取特定列的需求,在線分析處理往往需要在上百列的寬表中讀取指定列分析,而傳統(tǒng)的行式存儲(chǔ)在分析數(shù)據(jù)時(shí)往往需要使用索引或者遍歷整張表,帶來(lái)了非常大的額外開(kāi)銷(xiāo);
  • 列式存儲(chǔ)就近存儲(chǔ)同一列的數(shù)據(jù),使用壓縮算法可以得到更高的壓縮率,減少存儲(chǔ)占用的磁盤(pán)空間,雖然帶來(lái)了 CPU 時(shí)間的額外開(kāi)銷(xiāo),但是節(jié)省的 I/O 時(shí)間比帶來(lái)的額外開(kāi)銷(xiāo)更多;

列式存儲(chǔ)在 OLAP 的場(chǎng)景中有著種種優(yōu)勢(shì),不過(guò)它也不是數(shù)據(jù)存儲(chǔ)中的銀彈,仍然有很多缺點(diǎn),不過(guò)在這里就不做討論了。到最后,我們還是來(lái)看一些比較開(kāi)放的相關(guān)問(wèn)題,有興趣的讀者可以仔細(xì)思考一下下面的問(wèn)題:

  • 列式存儲(chǔ)在 OLTP 的場(chǎng)景中有哪些優(yōu)點(diǎn)?
  • HTAP 的場(chǎng)景會(huì)使用哪種方式存儲(chǔ)數(shù)據(jù)?

如果對(duì)文章中的內(nèi)容有疑問(wèn)或者想要了解更多軟件工程上一些設(shè)計(jì)決策背后的原因,可以在博客下面留言,作者會(huì)及時(shí)回復(fù)本文相關(guān)的疑問(wèn)并選擇其中合適的主題作為后續(xù)的內(nèi)容。

本文轉(zhuǎn)載自微信公眾號(hào)「真沒(méi)什么邏輯」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系真沒(méi)什么邏輯公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 真沒(méi)什么邏輯
相關(guān)推薦

2018-09-19 10:18:34

行式存儲(chǔ)列式存儲(chǔ)數(shù)據(jù)庫(kù)

2011-02-16 09:42:04

DevOps

2019-01-04 11:08:38

開(kāi)源分布式流存儲(chǔ)Pravega

2015-04-16 15:42:21

關(guān)系型數(shù)據(jù)庫(kù)NoSQL

2022-06-28 14:54:26

加密貨幣數(shù)組貨幣安全

2020-06-04 16:48:44

物聯(lián)網(wǎng)區(qū)塊鏈存儲(chǔ)

2018-12-21 09:36:31

OLAP蘇寧Druid

2018-09-14 18:00:29

無(wú)損網(wǎng)絡(luò)

2019-08-05 08:42:37

物聯(lián)網(wǎng)IOT技術(shù)

2022-08-26 08:00:19

企業(yè)架構(gòu)IT

2020-05-19 09:01:51

Overlay網(wǎng)絡(luò)虛擬化集群

2023-09-05 09:49:03

2020-04-06 14:45:22

云計(jì)算邊緣計(jì)算網(wǎng)絡(luò)

2022-12-01 14:43:56

物聯(lián)網(wǎng)智慧城市

2011-03-09 17:20:43

SSL VPNVPN

2020-04-01 11:19:03

物聯(lián)網(wǎng)LPWANIOT

2018-07-02 09:32:36

OceanBase列式存儲(chǔ)

2018-07-04 09:30:55

列式存儲(chǔ)格式

2023-11-07 08:00:00

Kubernetes

2020-08-03 07:50:56

存儲(chǔ)對(duì)象存儲(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)