【clickhouse專欄】clickhouse性能爲何如此卓越

在《clickhouse專欄》上一篇文章中《數據庫、數據倉庫之間的區別與聯繫》,我們介紹了什麼是數據庫,什麼是數據倉庫,二者的區別聯繫。clickhouse的定位是“數據倉庫”,所以理解了上一篇的內容,其實就能夠知道clickhouse適用於什麼樣的應用場景,不適合什麼樣的應用場景。
下面本節我們就來繼續爲大家介紹clickhouse的一些非常有意義的特性,來幫助大家更深入的理解ck的應用場景,以及它爲什麼被稱爲“性能怪獸”。

一、列式數據存儲

clickhouse的性能之所以彪悍,其列式存儲設計是非常重要的原因之一。給大家舉一個例子,假如我們現在有一張學生信息表student

id name age
1 小紅 7
2 小明 8
3 lucy 7

如果這張表採用行式數據存儲,其在磁盤上的結構是下面這樣的:

如果這張表採用列式數據存儲,其在磁盤上的結構是下面這樣的:

對比上面的兩張圖我們可以看到,採用列式存儲的優點。

  • 比如:我們查詢學生年齡的最大值,列式數據存儲只需要定位到年齡那一列的起始地址,然後順序讀取數據進行排序計算即可。而行式數據存儲的方式,因爲年齡這一字段的數據單元不是連續的,需要根據索引不斷的尋址,或者全表掃描才能獲取到所有的年齡數據。所以在採用列式存儲時,我們需要針對某一列進行查詢過濾、統計計算性能就遠勝於行式數據存儲方式
  • 另外,因爲數據庫的設計一列的數據通常是同一種數據類型,列式數據存儲有比行式存儲高達10倍以上的壓縮比,節省了大量的磁盤及內存空間,可以有效降低服務器成本。

二、支持SQL並且性能卓越

目前開源世界裏的大部分的列式存儲數據庫是不支持SQL的,即使很多號稱支持SQL,其實支持SQL也是僞SQL,並且支持能力有限。

但是經過筆者的實驗,clikhouse對於標準SQL的支持已經可以與傳統的關係型數據庫媲美,雖然對於數據倉庫click house,我更建議大家使用寬表進行數據存儲,但是不代表ck不具備多表關聯查詢的能力。

可以訪問:https://clickhouse.com/benchmark/dbms/ ,獲取click house官方在線的針對各種數據統計型SQL的性能對比。

三、分佈式分片存儲集羣

clikhouse不僅支持單機模式,也支持分佈式分片數據存儲的集羣模式。數據以分片的行式,存儲在多臺服務器節點上面,因此ck可以利用集羣服務器的規模計算能力,快速的做出數據統計結果的響應。ck數據分片分佈式存儲的機制,使得clickhouse具備了橫向擴展,海量數據分析處理的能力。

數據分片包括很多的方式,比如:數據隨機寫入不同服務器分片存儲上、數據被髮往指定的服務器分片存儲之上、數據按照hash值進行分片、當然我們還可以自定義數據分片的方式。

分佈式數據存儲將數據分散到集羣內的各個服務器上(以分片(shard)的行式存在),爲了保證數據的安全,每一個分片又有多個副本(replica),副本也是分佈式存儲的,這樣即使部分服務器宕機,仍然可以保障ck集羣可用。

四、 支持按序存儲

與傳統的RMDB數據庫不同的是,clickhouse支持在建表的時候就通過sort by關鍵字指定排序字段。這樣在數據入表的時候,實際是先進行了排序操作,按照排序字段進行排序後的數據有序存放。
後續在進行數據查詢、過濾、統計的時候,就能夠有效的、快速的獲取連續的數據塊中的數據,提升查詢統計的性能。這種按序存儲的特性其實還是有非常廣泛的應用場景的,比如:股票K線圖都是按照交易日時間排序的,預設排序字段、按序存儲有效的提升了統計性能。

五、支持數據TTL

在數據統計分析的數據庫中,通常我們需要數據TTL能力,也就是說:某些數據達到一定的存儲週期之後自動刪除。ck就提供了這種能力,降低了系統運維人員的工作難度。

ck支持以下幾種粒度的TTL

  • 列級別TTL:爲某一列設置TTL時間,當這一列中的部分數據過期之後,列值會被自動替換爲默認值,全部數據過期之後會自動刪除該列。
  • 行級別TTL:爲某一行設置TTL時間,當某一行過期後,會直接刪除該行。
  • 分區級別TTL:ck支持數據分區並設置TTL時間,當分區過期後,會直接刪除該分區。

推薦閱讀

限於博文篇幅,更多精彩內容我就不一一列舉了,推薦閱讀
《原創精品視頻及配套文檔:springboot-已錄製97節(免費)》
等等等等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章