目錄
一、什么是ClickHouse
二、ClickHouse有什么用途
三、ClickHouse的不足
四、適用場景
五、ClickHouse特點(diǎn)
六、ClickHouse VS?MySQL
七、類SQL 語句?
八、核心概念
一、什么是ClickHouse
- clickHouse是俄羅斯的 Yandex 公司于 2016 年開源的列式存儲(chǔ)數(shù)據(jù)庫,使用 C++ 語言編寫;
- 一款面向 OLAP 的數(shù)據(jù)庫
- ClickHouse支持類SQL語言,提供了傳統(tǒng)關(guān)系型數(shù)據(jù)的便利
二、ClickHouse有什么用途
專門用于 OLAP(聯(lián)機(jī)分析處理),其性能驚人;
什么是 OLAP? 聯(lián)機(jī)分析處理,又可以稱之為多維分析處理。它指的是通過多種不同的維度審視數(shù)據(jù),進(jìn)行深層次分析。
三、ClickHouse的不足
高性能面向 OLAP 的數(shù)據(jù)庫,不擅長的方面:
- 不支持事務(wù)
- 不擅長根據(jù)主鍵按行粒度進(jìn)行查詢(雖然支持),所以不應(yīng)該把 ClickHouse 當(dāng)做鍵值對數(shù)據(jù)庫使用
- 不擅長按行刪除數(shù)據(jù)(雖然支持)
對于 OLAP 數(shù)據(jù)庫而言,上述這些能力不是重點(diǎn),只能說這是為了極致的查詢性能所做的權(quán)衡。
四、適用場景
- 絕大多數(shù)請求都是讀取訪問權(quán)限。
- 數(shù)據(jù)以相當(dāng)大的批次(> 1000行)更新,而不是單行更新; 或者它根本沒有更新。
- 數(shù)據(jù)已添加到數(shù)據(jù)庫,但未進(jìn)行修改。
- 讀取數(shù)據(jù)時(shí),會(huì)從數(shù)據(jù)庫中提取出大量的行,但只用到一小部分列?列式存儲(chǔ)
- 數(shù)據(jù)一致性要求較低
五、ClickHouse特點(diǎn)
- 完備的DBMS功能
-
列式存儲(chǔ)和數(shù)據(jù)壓縮
列式存儲(chǔ),在掃描指定列時(shí),不用按行組織其他非指定列的數(shù)據(jù),避免多余的數(shù)據(jù)掃描。
數(shù)據(jù)壓縮,按照一定步長對數(shù)據(jù)進(jìn)行匹配掃描,當(dāng)發(fā)現(xiàn)重復(fù)部分的時(shí)候就進(jìn)行編碼轉(zhuǎn)換,降低IO和存儲(chǔ)的壓力。
-
向量化執(zhí)行引擎
簡單理解就是消除程序循環(huán)的優(yōu)化,堆機(jī)器加快速度,數(shù)據(jù)級并行。
-
關(guān)系模型與SQL查詢
????????其他數(shù)據(jù)庫遷移到CK的成本很低。
-
多樣化的表引擎
CK的最初架構(gòu)是基于MySQL實(shí)現(xiàn)的,表引擎設(shè)計(jì)就與MySQL類似,存儲(chǔ)引擎作為一層獨(dú)立的接口。種類繁多,根據(jù)業(yè)務(wù)場景自行選擇。
-
多線程與分布式
????????多線程處理就是通過線程級并行的方式實(shí)現(xiàn)了性能的提升。
????????預(yù)先將數(shù)據(jù)分布到各臺(tái)服務(wù)器,將數(shù)據(jù)的計(jì)算查詢直接下推到數(shù)據(jù)所在的服務(wù)器,因?yàn)橛?jì)算移動(dòng)比數(shù)據(jù)移動(dòng)更加劃算。
- 多主架構(gòu)
Multi-Master多主架構(gòu),集群中的每個(gè)節(jié)點(diǎn)角色對等,天然規(guī)避單點(diǎn)故障問題,適用于多數(shù)據(jù)中心、異地多活場景
- 在線查詢,CK又快又免費(fèi)
與其他分析型數(shù)據(jù)庫對比,存在許多相似之處,例如都支持海量查詢場景、支持列式存儲(chǔ)、數(shù)據(jù)分片、計(jì)算下推等特效,說明CK在設(shè)計(jì)上吸取了各路優(yōu)點(diǎn)。
價(jià)格方面:其他開源系統(tǒng)慢,商用系統(tǒng)貴。CK又快又免費(fèi)。
- 數(shù)據(jù)分片和分布式查詢
????????CK有本地表(Local Table)和分布式表(Distributed Table),一張本地表等同于一份數(shù)據(jù)的分片,而分布式表不存儲(chǔ)數(shù)據(jù),只是本地表的訪問代理。
????????分布式表類似分庫中間件,代理訪問多個(gè)數(shù)據(jù)分片,實(shí)現(xiàn)分布式查詢。
六、CH表對比
1、ClickHouse VS?MySQL
- MySQL單條SQL是單線程的,只能跑滿一個(gè)core,ClickHouse相反,有多少CPU,吃多少資源,所以飛快;
- ClickHouse不支持事務(wù),不存在隔離級別。ClickHouse的定位是分析性數(shù)據(jù)庫,而不是嚴(yán)格的關(guān)系型數(shù)據(jù)庫。
- IO方面,MySQL是行存儲(chǔ),ClickHouse是列存儲(chǔ),后者在count()這類操作天然有優(yōu)勢,同時(shí),在IO方面,MySQL需要大量隨機(jī)IO,ClickHouse基本是順序IO。
2、ClickHouse VS?Druid
參考:https://www.sohu.com/a/516246493_411876
在廣告場景下,基于benchmark分析來看,ClickHouse會(huì)比druid有許多可取之處:
- 數(shù)據(jù)存儲(chǔ)方面,ClickHouse的數(shù)據(jù)壓縮和列式存儲(chǔ)會(huì)極大節(jié)省存儲(chǔ)空間,而druid和其他多數(shù)數(shù)據(jù)庫都是基于時(shí)序的,druid在查詢大范圍的數(shù)據(jù)時(shí)會(huì)出現(xiàn)性能問題,而利用ClickHouse的分區(qū)鍵優(yōu)化可以有效的解決這個(gè)問題?
- 在查詢方面,druid的排序,聚合能力都不太好,靈活性和擴(kuò)展性也不夠,比如缺少join,子查詢,主鍵排序等這些需求。而這些用SQL都可以通過ClickHouse來支持解決。
- 運(yùn)維成本方面,Druid的運(yùn)維是非常復(fù)雜的,雖然支持多種數(shù)據(jù)攝入的組件,但是組件的構(gòu)成是比較復(fù)雜的,節(jié)點(diǎn)數(shù)量有6種之多,而ClickHouse架構(gòu)采用的是對等節(jié)點(diǎn)的設(shè)計(jì),節(jié)點(diǎn)就有一種類型,沒有主從節(jié)點(diǎn)。
七、類SQL 語句?
1、 客戶端登陸命令 : clickhouse-client -u user --password 123456 --port 9000
2、利用system數(shù)據(jù)庫中的parts_columns表進(jìn)行查詢。
select distinct column from system.parts_columns?
where database='表所屬的數(shù)據(jù)庫名稱' and table='所需要查詢的表名'
例如:
select distinct column from system.parts_columns where database='test' and table='table1'
3、利用system數(shù)據(jù)庫中的columns表進(jìn)行查詢。
select distinct name from system.columns?
where database='表所屬的數(shù)據(jù)庫名稱' and table='所需要查詢的表名'
例如:
select distinct name from system.columns where database='test' and table='table1'
ps :–推薦使用第二種方式來查詢表的所有列名。
4、
?alter table 表名稱 ON 集群名稱 add column 列名稱; ? ? ? ?--添加列
?alter table 表名稱 ON 集群名稱 drop column 列名稱; ? ? ? --刪除列
?alter table 表名稱 ON 集群名稱 modify column 列名稱 數(shù)據(jù)類型; ? --修改數(shù)據(jù)類型
?alter table 表名稱 ON 集群名稱 COMMENT COLUMN 列名稱 注解; ? ? --修改注釋
5、建表
CREATE TABLE test.table1(
? ? `id` String COMMENT '主鍵',
? ? `chinese_name` Nullable(String) COMMENT '中文名稱',
? ? `english_name` Nullable(String) COMMENT '英文名稱',
? ? `update_time` Nullable(DATETIME) COMMENT '更新時(shí)間',
? ? `create_time` Nullable(DATETIME) COMMENT '創(chuàng)建時(shí)間'
)
ENGINE = MergeTree
order by id
6、刪除表
//刪除本地表
DROP table ti.java4al_base on cluster ck;
//刪除分布式表
DROP table ti.java4al_base_all on cluster ck;
7、刪除數(shù)據(jù):?
方法1: 刪除分區(qū) alter table ?name drop partition 分區(qū);
方法:alter 語句 : alter table ?name delete where?
ALTER TABLE <table_name> UPDATE col1 = expr1, ... WHERE <filter>
方法:
索引列不能進(jìn)行更新
8、查詢表容量及壓縮
select
? ? table as "表名",
? ? sum(rows) as "總行數(shù)",
? ? formatReadableSize(sum(data_uncompressed_bytes)) as "原始大小",
? ? formatReadableSize(sum(data_compressed_bytes)) as "壓縮大小",
? ? round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes) * 100, 0) "壓縮率"
from system.parts
? ? group by table;?? ?
八、核心概念
幾個(gè)概念:
1、Column與Field:一列中的某一行(具體數(shù)值)用Field對象表示;一列數(shù)據(jù)用一個(gè)Column對象表現(xiàn)
2、DataType?: 負(fù)責(zé)數(shù)據(jù)的序列化和反序列化相關(guān)工作,但是并不直接負(fù)責(zé)數(shù)據(jù)的讀取,而是轉(zhuǎn)由Column或Field對象獲取。在DataType的實(shí)現(xiàn)類中,聚合了相應(yīng)數(shù)據(jù)類型的Column對象和Field對象。
3、Block對象:CK的數(shù)據(jù)操作是面向Block對象進(jìn)行的,并且是采用流的形式。Block=數(shù)據(jù)對象(Column/Feild) + DataType + 列名稱字符串。
4、Table:
在數(shù)據(jù)表的底層設(shè)計(jì)中并沒有所謂的Table對象,它直接使用 IStorage接口指代數(shù)據(jù)表。
表引擎是ClickHouse的一個(gè)顯著特性, 不同的表引擎由不同的子類實(shí)現(xiàn),例如IStorageSystemOneBlock (系統(tǒng)表)、StorageMergeTree(合并樹表引擎)和 StorageTinyLog(日志表引擎)等。
5、Parser和Interpreter
Parser分析器負(fù)責(zé)創(chuàng)建AST對象,而Interpreter解釋器則負(fù)責(zé)解釋AST,并進(jìn)一步創(chuàng)建查詢的執(zhí)行管道。它們與IStorage一起,串聯(lián)起了整個(gè)數(shù)據(jù)查詢的過程。
Parser分析器可以將一條SQL語句以遞歸下降的方法解析成 AST語法樹的形式。
不同的SQL語句,會(huì)經(jīng)由不同的Parser實(shí)現(xiàn)類解析。
6、Functions與Aggregate Functions
- 普通函數(shù),例如四則運(yùn)算、日前轉(zhuǎn)換、網(wǎng)址提取函數(shù)、IP地址脫敏函數(shù)。沒有狀態(tài),函數(shù)效果作用于每行數(shù)據(jù)之上。在函數(shù)具體執(zhí)行過程中,采用向量化的方式直接作用于一整列數(shù)據(jù),而不是一行一行計(jì)算。
- 聚合函數(shù),有狀態(tài)的,例如COUNT聚合函數(shù),AggregateFunctionCount的狀態(tài)用整型UInt64記錄。聚合函數(shù) 的狀態(tài)支持序列化與反序列化,所以能夠在分布式節(jié)點(diǎn)之間進(jìn)行傳 輸,以實(shí)現(xiàn)增量計(jì)算。
7、Cluster與Replication
集群由分片(Shard)組成,分片由副本(Replica)組成。
CK的1個(gè)節(jié)點(diǎn)只能擁有一個(gè)分片,如果要實(shí)現(xiàn)1分片、1副本,至少需要部署兩個(gè)服務(wù)節(jié)點(diǎn)。文章來源:http://www.zghlxwxcb.cn/news/detail-813888.html
分片是邏輯概念,物理承載由副本承擔(dān)。文章來源地址http://www.zghlxwxcb.cn/news/detail-813888.html
到了這里,關(guān)于大數(shù)據(jù)系列——什么是ClickHouse?ClickHouse有什么用途?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!