ClickHouse的特性及读写
1 ClickHouse特性
??OLAP數(shù)據(jù)庫一般有2個(gè)要求:①容量要比關(guān)系型數(shù)據(jù)庫大,②在線查詢的速度要快。ClickHouse這兩點(diǎn)都滿足并且還支持標(biāo)準(zhǔn)的sql,支持比較復(fù)雜的語句,支持分布式。ClickHouse的幾個(gè)顯著特點(diǎn)如下:
??(1)列式存儲(chǔ)
??列式存儲(chǔ)的優(yōu)點(diǎn):①列式存儲(chǔ)不同于行式存儲(chǔ),以行為單位進(jìn)行存儲(chǔ),行式存儲(chǔ)更變故搜索查詢。列式存儲(chǔ)以列為單位進(jìn)行存儲(chǔ),這樣更適合做聚合計(jì)算,如求和是針對(duì)一列的數(shù)據(jù)進(jìn)行求和,這一列的數(shù)據(jù)又放在一起。②行式存儲(chǔ)每個(gè)字段類型不一致,列式存儲(chǔ)不同的類型是不在一起的,一個(gè)數(shù)據(jù)塊存儲(chǔ)的類型都是一致的,這樣的話就便于壓縮,類型相同壓縮算法發(fā)揮的空間就比較大,壓縮比高,所以海量數(shù)據(jù)的話就能對(duì)節(jié)省磁盤空間。③因?yàn)橐粋€(gè)數(shù)據(jù)塊類型相同,壓縮比高,不僅節(jié)省了磁盤空間,還節(jié)省了內(nèi)存空間,可以在內(nèi)存中存儲(chǔ)更多的數(shù)據(jù)。
??列式存儲(chǔ)的缺點(diǎn):不支持事務(wù)
??(2)支持DBMS的功能
??支持的SQL和關(guān)系型數(shù)據(jù)庫基本沒有什么差別,支持標(biāo)準(zhǔn)SQL的大部分語法,包括DDL和DML及各種函數(shù)。雖然ClickHouse可以修改數(shù)據(jù)結(jié)構(gòu),可以刪除數(shù)據(jù),但是性能不好。
??(3)支持多種引擎
??ClickHouse與Mysql類型把表級(jí)別的存儲(chǔ)引擎插件化,支持的引擎可以分為6大類,用的最多的是MegreTree家族
2 ClickHouse的寫入
??一般關(guān)系型數(shù)據(jù)的寫入基本上是隨機(jī)寫,為了方便查詢,要知道插入的位置,找到合適的位置插入。寫入操作本事不重,但是要找到合適的位置就是個(gè)問題,隨機(jī)的讀寫,每次寫入位置不同,機(jī)械磁盤的磁頭就不同的轉(zhuǎn)找位置,所以寫入能力比較弱。像HBASE,也是隨機(jī)寫入,但是采用LSM樹進(jìn)行是異步的寫入,先把數(shù)據(jù)寫到內(nèi)存,就完事了,要插入的位置交給磁盤去處理。
??ClickHouse也是采用了LSM Tree結(jié)構(gòu)數(shù)據(jù)寫入后定期在后臺(tái)合并。寫入操作是先寫到內(nèi)存,然后在寫磁盤的時(shí)候不是寫到對(duì)應(yīng)的位置,而是直接寫到一個(gè)臨時(shí)的分區(qū)里面,全部都堆在內(nèi)存數(shù)據(jù)量大的話很麻煩,然后會(huì)簡單的做個(gè)排序,后臺(tái)會(huì)異步周期性的將臨時(shí)分區(qū)的數(shù)據(jù)合并到整個(gè)存儲(chǔ)分區(qū)中
3 ClickHouse的讀取
??ClickHouse將數(shù)據(jù)劃分為多個(gè)分區(qū)(partition),每個(gè)分區(qū)再進(jìn)一步劃分為多個(gè)索引段(index ganularity)。把分區(qū)里面的數(shù)據(jù)劃分成細(xì)粒度的好處是可以多核并行處理。
??假設(shè)一個(gè)數(shù)據(jù)有3個(gè)分區(qū),執(zhí)行一條查詢SQL沒有指定任何分區(qū)的話就利用多線程,把SQL提交到每個(gè)分區(qū)查詢,每個(gè)CPU現(xiàn)成管理一個(gè)分區(qū)的數(shù)據(jù)查詢,最后合并結(jié)果。這種極致的并行處理能力極大的降低了查詢的延遲。但是因?yàn)椴樵兪嵌嗑€程的,所以非常消耗CPU,每條SQL都是并行的,這樣的話帶來的問題就是并行查詢很多SQL的時(shí)候就會(huì)并發(fā)非常高,核數(shù)不夠的話CPU就會(huì)不停的在線程之間來回切換。CPU在大量線程里面輪轉(zhuǎn)本事就要消耗CPU,所以開銷更大。
??ClickHouse對(duì)一條SQL就已經(jīng)是高并發(fā),并行處理了,如果提交的SQL還是高并發(fā)就不適合使用ClickHouse。ClickHouse適合查詢數(shù)據(jù)量比較大,SQL比較復(fù)雜的查詢,他的單一SQL處理能力非常強(qiáng),因?yàn)槭遣⑿械?#xff0c;如即席查詢,或者像大屏這種低頻的查詢。不適合開發(fā)給用戶,進(jìn)行高QPS的查詢業(yè)務(wù),他的QPS理論上比Mysql還要低。
4 與標(biāo)準(zhǔn)SQL的區(qū)別
4.1 Insert
??與標(biāo)準(zhǔn)SQL基本一致,包括標(biāo)準(zhǔn)的插入
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...??以及表到表的插入
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...??但是和hive不一樣沒有insert overwrite
4.2 Update,Delete
??ClickHouse有Update和Delete的能力,可看做是Alter的一種,但是和一般的OLAP數(shù)據(jù)庫不一樣,稱為Mutation查詢。Mutation的語法,其實(shí)是數(shù)據(jù)結(jié)構(gòu)的調(diào)整,本身不是以數(shù)據(jù)為單位的修正。
??Mutation是很重的操作,因?yàn)槊看涡薷幕蛘邉h除都會(huì)導(dǎo)致放棄目標(biāo)數(shù)據(jù)原有的分區(qū),意味著分區(qū)會(huì)被重寫,假設(shè)我們以天為分區(qū)。假設(shè)一個(gè)分區(qū)內(nèi)的數(shù)據(jù)有被刪除或者修改了。刪除的話他是把這個(gè)分區(qū)的數(shù)據(jù)重新的再建立一個(gè)新分區(qū),沒有刪除的數(shù)據(jù)就會(huì)重新復(fù)制一份,老分區(qū)的數(shù)據(jù)暫時(shí)不動(dòng),做數(shù)據(jù)合并的時(shí)候他會(huì)被刪除掉。我們查的時(shí)候感覺不出,其實(shí)分區(qū)已經(jīng)替換了,所以是個(gè)很重的操作,而且不支持事務(wù)。Mutation支持分為兩步,同步的操作時(shí)在新增數(shù)據(jù)新增分區(qū)的時(shí)候把就分區(qū)打上邏輯上的失敗標(biāo)記,指導(dǎo)觸發(fā)合并的時(shí)候才會(huì)刪除就數(shù)據(jù)釋放磁盤空間
??所以要做Update和Delete的話盡量做批量的操作,不進(jìn)行頻繁的小數(shù)據(jù)操作。
??刪除
ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr??修改
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr4.3 Select
??select查詢與標(biāo)準(zhǔn)SQL差別不大:①支持子查詢②支持with子句③支持join(不推薦,join無法使用緩存)④但是不支持窗口函數(shù)⑤不支持自定義函數(shù),mysql可以做個(gè)function自定義函數(shù),還有存儲(chǔ)過程,hive有個(gè)變相的方法語法上不支持,但是可以寫代碼自定義jar包發(fā)布成一個(gè)函數(shù)。ClickHouse是c++寫的,只能通過改源碼編譯可能支持部分的,只能是常駐特別簡單的,針對(duì)業(yè)務(wù)的函數(shù)不可能每次重編譯,所以不行。⑥group by操作增加了按照維度來計(jì)算匯總的操作:with rollup(上卷)從右往左依次去掉維度匯總/with cube(立方體)從右邊開始去完維度,從左邊開始去維度;/with total(只計(jì)算合計(jì))等操作
4.4 Alert
??可以根據(jù)字段或者數(shù)據(jù)結(jié)構(gòu)進(jìn)行調(diào)整,這種alert都是比較重,一般都是在夜里批量的操作
ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ...4.5 導(dǎo)出數(shù)據(jù)
??即席查詢往往是從數(shù)據(jù)庫里臨時(shí)需要導(dǎo)出一張報(bào)表來導(dǎo)出execel讓業(yè)務(wù)人員去用,所以導(dǎo)出是常用的,常用的就是csv,csvwithNames是帶表頭的
clickhouse-client --query="SELECT * FROM {some_table} FORMAT Avro" > file.avro??對(duì)應(yīng)的插入語句為
cat file.avro | clickhouse-client --query="INSERT INTO {some_table} FORMAT Avro" 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的ClickHouse的特性及读写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 等价类、决策表测试
- 下一篇: 设计精美Power Bi报告的诀窍以及让