ClickHouse 是俄羅斯的Yandex于2016年開源的 列式存儲數(shù)據(jù)庫(DBMS)系瓢,使用C++語言編寫,主要用于 在線分析處理查詢(OLAP)揖闸,能夠使用SQL查詢實時生成分析數(shù)據(jù)報告揍堕。
列式存儲
行存儲以下表為例
ID | NAME | AGE |
---|---|---|
1 | 張三 | 18 |
2 | 李四 | 22 |
3 | 王五 | 38 |
采用行存儲時,數(shù)據(jù)在磁盤上的組織結(jié)構(gòu)為
1 | 張三 | 18 | 2 | 李四 | 22 | 3 | 王五 | 34 |
---|
好處是想查某個人所有的屬性時汤纸,可以通過一次磁盤查找加順序讀取就可以衩茸。但是當(dāng)想查所有人的年齡時,需要不停的查找蹲嚣,或者全表掃描才行递瑰,遍歷的很多數(shù)據(jù)都是不需要的。
采用列存儲時隙畜,數(shù)據(jù)在磁盤上的組織結(jié)構(gòu)為
1 | 2 | 3 | 張三 | 李四 | 王五 | 18 | 22 | 34 |
---|
這時相查所有人的年齡只需要把年齡那一列拿出來就可以了抖部。
列式存儲的好處:
- 對于列的聚合,計數(shù)议惰,求和等統(tǒng)計操作由于行式存儲
- 由于某一列的數(shù)據(jù)類型都是相同的慎颗,針對于數(shù)據(jù)存儲更容易進(jìn)行數(shù)據(jù)壓縮,每一列選擇更優(yōu)的數(shù)據(jù)壓縮算法,大大提高了數(shù)據(jù)的壓縮比重俯萎。
- 由于數(shù)據(jù)壓縮比更好傲宜,一方面節(jié)省了磁盤空間,另一方面對于 cache 也有了更大的發(fā)揮空間夫啊。
DBMS
幾乎覆蓋了標(biāo)準(zhǔn)SQL的大部分語法函卒,包括DDL和DML,以及配套的各種函數(shù)撇眯,用戶管理及權(quán)限管理报嵌,數(shù)據(jù)的備份與恢復(fù)。
多樣化引擎
ClickHouse 和 MySql 類似熊榛,把表級的存儲引擎插件優(yōu)化锚国,根據(jù)表的不同需求可以設(shè)定不同的存儲引擎。目前包括合并樹(Merge Tree)玄坦、日志血筑、接口和其他四大類20多種引擎。
高吞吐寫入能力
ClickHouse 采用類 LSM Tress(HBASE 也是) 的結(jié)構(gòu)煎楣,數(shù)據(jù)寫入后定期在后臺 Compaction豺总。通過類似 LSM Tree的結(jié)構(gòu),ClickHouse 在數(shù)據(jù)導(dǎo)入時全部是順序 append 寫入转质,寫入后數(shù)據(jù)段不可更改园欣,在后臺 compaction 時也是多個段 merge sort后循序?qū)懟卮疟P。順序?qū)懙奶匦孕菪罚浞掷昧舜疟P的吞吐能力沸枯,即便在HDD上也有著優(yōu)異的寫入性能。
官方公開 benchmark 測試顯示能夠達(dá)到 50MB-200MB/s 的寫入吞吐能力赂弓,按照每行 100Byte 估算绑榴,大約相當(dāng)于 50W-200W 條/s的寫入速度。
數(shù)據(jù)分區(qū)與線程級并行
ClickHouse 將數(shù)據(jù)劃分為多個 partition盈魁,每個 partition 再進(jìn)一步劃分為多個 index granularity(索引粒度)翔怎,然后通過多個CPU核心分別處理其中的一部分來實現(xiàn)并行數(shù)據(jù)處理。在這種設(shè)計下杨耙,單條Query就能利用整機所有CPU赤套。極致的并行處理能力,極大的降低了查詢延時珊膜。
所以容握,ClickHouse 即使對于大量數(shù)據(jù)的查詢也能夠化整為零平行處理。但是有一個弊端就是對于單條查詢使用多CPU车柠,就不利于同時并發(fā)多條查詢剔氏。所以對于高qps的查詢業(yè)務(wù)塑猖,ClickHouse 并不是強項。
性能對比
單表
關(guān)聯(lián)查詢
結(jié)論
ClickHouse 像很多 OLAP 數(shù)據(jù)庫一樣谈跛,單表查詢速度優(yōu)于關(guān)聯(lián)查詢羊苟,而且 ClickHouse 的兩者差距更為明顯。