列數(shù)據(jù)庫是什么東東?何時(shí)應(yīng)該使用它?
譯文?譯者 | 布加迪
審校 | 孫淑娟
說到為具體應(yīng)用選擇數(shù)據(jù)庫,有很多不同的選項(xiàng)。經(jīng)常討論的話題似乎是選擇SQL數(shù)據(jù)庫還是選擇NoSQL數(shù)據(jù)庫,即數(shù)據(jù)應(yīng)該存儲在關(guān)系數(shù)據(jù)庫中,還是存儲在鍵值、文檔或圖形數(shù)據(jù)庫之類的NoSQL數(shù)據(jù)庫中。

另一種選擇是索性使用列數(shù)據(jù)庫。本文介紹為什么有必要做出這種選擇,以及列數(shù)據(jù)庫的一些優(yōu)缺點(diǎn)。
列數(shù)據(jù)庫的定義
顧名思義,列(或列式)數(shù)據(jù)庫將按列組織而不是按行組織的數(shù)據(jù)存儲在磁盤上。以物聯(lián)網(wǎng)傳感器為例,基于行的數(shù)據(jù)庫會如圖所示將數(shù)據(jù)存儲在磁盤上:

而列數(shù)據(jù)庫將組織相同的數(shù)據(jù),以便每個(gè)列值按順序存儲在磁盤上:

列數(shù)據(jù)庫的主要優(yōu)點(diǎn)是,由于壓縮比提高,它可以大大縮減存儲數(shù)據(jù)所需的磁盤空間。此外,列數(shù)據(jù)庫在處理分析型查詢時(shí)比基于行的傳統(tǒng)數(shù)據(jù)庫要快得多。
為什么列數(shù)據(jù)庫適合分析型工作負(fù)載?
那么,改變數(shù)據(jù)的存儲格式究竟如何提升性能的呢?與傳統(tǒng)數(shù)據(jù)庫相比,有幾個(gè)因素導(dǎo)致列數(shù)據(jù)庫能夠?yàn)槁?lián)機(jī)分析處理(LAP)工作負(fù)載提供高得多的性能。
第一個(gè)原因是壓縮比提高。這是由于列數(shù)據(jù)庫能夠?yàn)槊糠N類型的數(shù)據(jù)使用最佳壓縮算法,因?yàn)槊苛卸际窍嗤愋偷臄?shù)據(jù),而不是一行混合類型的數(shù)據(jù)。這不僅降低了磁盤上的存儲成本,還提高了性能,因?yàn)樾枰拇疟P尋道更少,內(nèi)存可以容納更多的數(shù)據(jù)。
列數(shù)據(jù)庫提升性能的另一種方法是實(shí)際上在底層存儲同一列的多個(gè)不同版本,這些版本按不同的順序進(jìn)行排序,以便為某些查詢加快過濾和選擇的速度。
列數(shù)據(jù)庫還可以通過許多其他方法來提升性能。下面是幾個(gè)例子:
- 查詢數(shù)據(jù)時(shí)進(jìn)行自適應(yīng)索引
 - 矢量化處理
 - 列的連接經(jīng)過優(yōu)化,變得更有效
 - 列的后期物化
 
這篇??論文??分析了列數(shù)據(jù)庫的性能,作為論文一部分進(jìn)行的測試的示意圖顯示了上述優(yōu)化的結(jié)果?;赥PC-H數(shù)據(jù)倉庫基準(zhǔn)數(shù)據(jù)集,列數(shù)據(jù)庫的運(yùn)行速度比傳統(tǒng)的行結(jié)構(gòu)數(shù)據(jù)庫快10倍左右。

該圖顯示了哪些優(yōu)化對列數(shù)據(jù)庫的性能影響最大,在此處,后期物化帶來的性能提升最大。
列數(shù)據(jù)庫性能方面的取舍
與計(jì)算機(jī)科學(xué)界的幾乎所有事情一樣,列數(shù)據(jù)庫性能方面也進(jìn)行了一番取舍。它們針對分析型工作負(fù)載進(jìn)行了優(yōu)化,本身不適合傳統(tǒng)的聯(lián)機(jī)事務(wù)處理(OLTP)工作負(fù)載,而關(guān)系數(shù)據(jù)庫為這種工作負(fù)載而設(shè)計(jì)。
最大的性能犧牲將出現(xiàn)在試圖更新特定數(shù)據(jù)點(diǎn)或?qū)懭雴蝹€(gè)數(shù)據(jù)點(diǎn)的情況下。就列數(shù)據(jù)庫而言,您希望盡可能批量插入數(shù)據(jù)。
列數(shù)據(jù)庫還會對讀查詢有影響,您獲取一行中的所有數(shù)據(jù),就像使用關(guān)系數(shù)據(jù)庫一樣。由于必須重新構(gòu)造每一列才能創(chuàng)建整行,因此性能會受到影響。
列數(shù)據(jù)庫的用例
列數(shù)據(jù)庫非常適合您想要分析大量數(shù)據(jù)的任何情況。不妨看一下幾個(gè)常見的用例。
商業(yè)智能
列數(shù)據(jù)庫非常適合分析銷售數(shù)據(jù),因?yàn)樗鼈冏屇梢砸愿鞣N方式劃分信息。這可以幫助您確定可能無法看到的趨勢和模式。比如說,可以使用列數(shù)據(jù)庫按位置、品牌或產(chǎn)品類別來比較一段時(shí)間不同產(chǎn)品的銷售數(shù)據(jù)。
應(yīng)用程序性能監(jiān)控
應(yīng)用程序性能監(jiān)控是使用列數(shù)據(jù)庫幫助提高軟件可靠性和性能的另一種常見情況。通過跟蹤和分析有關(guān)應(yīng)用程序運(yùn)行狀況的數(shù)據(jù),您可以在問題導(dǎo)致應(yīng)用程序崩潰或變慢之前發(fā)現(xiàn)問題。這有助于避免停運(yùn)時(shí)間,并確保用戶獲得最佳體驗(yàn)。如果使用列數(shù)據(jù)庫,您可以存儲粒度更細(xì)的數(shù)據(jù)以獲得更深入的洞察力,同時(shí)因出色的數(shù)據(jù)壓縮而降低成本。
物聯(lián)網(wǎng)
組織在部署越來越多的聯(lián)網(wǎng)設(shè)備,其中許多設(shè)備收集用于分析工作負(fù)載的數(shù)據(jù)。列數(shù)據(jù)庫可用于存儲這些數(shù)據(jù),以實(shí)現(xiàn)實(shí)時(shí)警報(bào),還可用于生成預(yù)測,在許多不同行業(yè)提高效率。
專門化列數(shù)據(jù)庫的示例
到目前為止,我們已經(jīng)大體了解了列數(shù)據(jù)庫及其優(yōu)點(diǎn)。雖然所有列數(shù)據(jù)庫有相同的特征,可以有效地用作通用數(shù)據(jù)倉庫或數(shù)據(jù)湖,不過下面介紹如何針對更具體的性能特征對它們進(jìn)行調(diào)優(yōu)和優(yōu)化。
InfluxDB IOx
InfluxDB IOx是一款面向InfluxDB的開源列存儲引擎,為處理時(shí)間序列數(shù)據(jù)進(jìn)行了優(yōu)化。時(shí)間序列數(shù)據(jù)在性能方面帶來了獨(dú)特的挑戰(zhàn):
- 分析類型的查詢,只需要幾列數(shù)據(jù),比如從傳感器獲得過去一周的平均溫度。
 - 關(guān)系類型的查詢,用戶需要過去5分鐘內(nèi)來自許多不同傳感器的所有可用信息。
 
時(shí)間序列數(shù)據(jù)還往往大批量到達(dá),這需要快速獲取能力,以便能夠快速索引和查詢數(shù)據(jù),用于實(shí)時(shí)監(jiān)控和警報(bào)。此外,許多用戶希望能夠長期存儲這些數(shù)據(jù),用于歷史分析和預(yù)測,又不必?fù)?dān)心成本過高。
InfluxDB讓用戶可以集兩者之所長,其辦法是管理數(shù)據(jù)的生命周期,并在熱存儲和冷存儲之間移動(dòng)數(shù)據(jù),歷史數(shù)據(jù)方面獲得快速性能,同時(shí)通過對未頻繁查詢的數(shù)據(jù)使用更便宜的對象存儲來降低存儲成本。
實(shí)現(xiàn)這一目標(biāo)的關(guān)鍵手段就是構(gòu)建和貢獻(xiàn)Apache Arrow、DataFusion和Parquet之類的項(xiàng)目。Arrow允許數(shù)據(jù)在內(nèi)存中以列格式壓縮,并在數(shù)據(jù)庫的不同部分之間移動(dòng)。Parquet用于高效的持久性存儲,DataFusion提供高性能查詢和SQL支持。其他許多主要項(xiàng)目和廠商也在夯實(shí)Parquet和Arrow項(xiàng)目,這些項(xiàng)目還能夠與更廣泛的大數(shù)據(jù)生態(tài)系統(tǒng)實(shí)現(xiàn)集成和兼容。
ApacheDruid
Apache Druid是一款擁有底層列數(shù)據(jù)結(jié)構(gòu)的實(shí)時(shí)數(shù)據(jù)庫。Druid適用于典型的數(shù)據(jù)倉庫類型工作負(fù)載,比如您期望從列數(shù)據(jù)庫獲得的工作負(fù)載,但它也優(yōu)先考慮低延遲響應(yīng)時(shí)間,常常用于交互式用戶界面之類的對象。
DuckDB
DuckDB是為OLAP工作負(fù)載設(shè)計(jì)的進(jìn)程內(nèi)數(shù)據(jù)庫,實(shí)際上旨在成為面向分析的SQLite。DuckDB使用列式矢量化處理,以出色的性能運(yùn)行SQL查詢,可以輕松嵌入到應(yīng)用程序中。DuckDB的主要賣點(diǎn)是,在大多數(shù)OLAP數(shù)據(jù)庫要么云托管要么需要復(fù)雜安裝過程的環(huán)境下,它很容易在本地設(shè)置和運(yùn)行。
選擇適合具體任務(wù)的工具
說到底,技術(shù)決策歸結(jié)為什么技術(shù)對您的用例有意義。說到長期構(gòu)建應(yīng)用程序,選擇數(shù)據(jù)庫可能是最重要的選擇之一,因此有必要了解所有可用的選項(xiàng),選擇最適合的那一種。
如果您在處理主要用于分析的大量數(shù)據(jù),那么列數(shù)據(jù)庫可能是個(gè)不錯(cuò)的選擇。
原文標(biāo)題:??What Is a Column Database and When Should You Use One???,作者:Charles Mahler?















 
 
 











 
 
 
 