這兩年 ClickHouse 非常的火,尤其是在大數(shù)據(jù)領(lǐng)域。
Yandex
在開始之前,我們先說一下 Yandex 這家公司,它是俄羅斯的一家互聯(lián)網(wǎng)巨頭公司,雖然在國(guó)際上沒什么名氣,但在俄羅斯,它就是老大,是俄羅斯排名第一的搜索引擎公司。是和谷歌、百度一樣的存在。ClickHouse 誕生于 2016 年,來自于 Yandex 公司。
老毛子在國(guó)際互聯(lián)網(wǎng)上,雖然沒有像中美這樣具有統(tǒng)治地位的互聯(lián)網(wǎng)公司,但是老毛子的一些開源軟件的性能還是杠杠的。比如,大名鼎鼎的 Nginx,再比如我們今天要討論的 ClickHouse,所以,ClickHouse 還是非常值得一學(xué)的。
ClickHouse
ClickHouse 主要用于在線分析處理查詢(OLAP),能夠使用 SQL 查詢實(shí)時(shí)生成分析數(shù)據(jù)報(bào)告。
和我們常見的關(guān)系型數(shù)據(jù)庫非常不同。比如,MySQL,Postgresql,SQL Server 等數(shù)據(jù)庫采用的都是行式存儲(chǔ),而 ClickHouse 采用的卻是列式存儲(chǔ)。下面我們通過一個(gè)簡(jiǎn)單的例子,來比較它們的不同。

如上述表格所示,傳統(tǒng)的 MySQL 數(shù)據(jù)庫的每一行數(shù)據(jù)都是物理的存儲(chǔ)在一起的。如果我要去 id 等于 10000 這一條數(shù)據(jù)的 name 列,那我就必須要把這一行數(shù)據(jù)讀取出來,然后取 name 列。
再比如,下面的 SQL:
SELECT name FROM xttblog where id > 10000;
在眾多的數(shù)據(jù)中,我只取一列,但我需要把每條數(shù)據(jù)都讀取出來。
基于上面?zhèn)鹘y(tǒng)數(shù)據(jù)庫的一些特點(diǎn),ClickHouse 另辟蹊徑,推出了列式存儲(chǔ)。

看上圖的列式存儲(chǔ)示例,完全和 MySQL 等數(shù)據(jù)庫不同。當(dāng)我執(zhí)行下面的 SQL 時(shí),查詢效率非常的高!
SELECT name FROM xttblog where id > 10000;
由于 name 列的數(shù)據(jù)都存儲(chǔ)在一起,因此效率大大地超過了傳統(tǒng)的數(shù)據(jù)庫。

除了邏輯上的不同,磁盤上的組織結(jié)構(gòu)也大不一樣。

除了列式存儲(chǔ)上的不同,ClickHouse 還有高效的數(shù)據(jù)壓縮,默認(rèn)使用LZ4算法,總體壓縮比可達(dá) 8:1。ClickHouse 還采用了分布式多主架構(gòu)提高并發(fā)性能,ClickHouse使讀請(qǐng)求可以隨機(jī)打到任意節(jié)點(diǎn),均衡讀壓力,寫請(qǐng)求也無需轉(zhuǎn)發(fā)到master節(jié)點(diǎn),不會(huì)產(chǎn)生單點(diǎn)壓力。
ClickHouse 還有向量引擎,利用 SIMD 指令實(shí)現(xiàn)并行計(jì)算。對(duì)多個(gè)數(shù)據(jù)塊來說,一次 SIMD 指令會(huì)同時(shí)操作多個(gè)塊,大大減少了命令執(zhí)行次數(shù),縮短了計(jì)算時(shí)間。向量引擎在結(jié)合多核后會(huì)將 ClickHouse 的性能淋漓盡致地發(fā)揮出來。
ClickHouse 在索引上也有不同,采用了稀數(shù)索引及跳數(shù)索引。同時(shí)還有很多 MergeTree,提供海量業(yè)務(wù)場(chǎng)景支持。