目前ClickHouse的表引擎主要有下面四個(gè)系列,合并樹(shù)家族急前、日志引擎系列、集成的表引擎和其他特殊的引擎。
合并樹(shù)家族
Clickhouse中最強(qiáng)大的表引擎當(dāng)屬M(fèi)ergeTree(合并樹(shù))引擎及該系列(MergeTree)中的其他引擎钓猬。
MergeTree系列的引擎被設(shè)計(jì)用于插入極大量的數(shù)據(jù)到一張表當(dāng)中。數(shù)據(jù)可以以數(shù)據(jù)片段的形式一個(gè)接著一個(gè)的快速寫(xiě)入碴倾,數(shù)據(jù)片段在后臺(tái)按照一定的規(guī)則進(jìn)行合并逗噩。相比在插入時(shí)不斷修改(重寫(xiě))已存儲(chǔ)的數(shù)據(jù)掉丽,這種策略會(huì)高效很多。
主要特點(diǎn)
- 存儲(chǔ)的數(shù)據(jù)按主鍵排序异雁。這使得您能夠創(chuàng)建一個(gè)小型的稀疏索引來(lái)加快數(shù)據(jù)檢索捶障。
- 如果指定了分區(qū)鍵的話,可以使用分區(qū)纲刀。在相同數(shù)據(jù)集和相同結(jié)果集的情況下ClickHouse中某些帶分區(qū)的操作會(huì)比普通操作更快项炼。查詢中指定了分區(qū)鍵時(shí)ClickHouse會(huì)自動(dòng)截取分區(qū)數(shù)據(jù)。這也有效增加了查詢性能示绊。
- 支持?jǐn)?shù)據(jù)副本锭部。ReplicatedMergeTree系列的表提供了數(shù)據(jù)副本功能。
- 支持?jǐn)?shù)據(jù)采樣面褐。需要的話拌禾,您可以給表設(shè)置一個(gè)采樣方法。
日志引擎系列
這些引擎是為了需要寫(xiě)入許多小數(shù)據(jù)量(少于一百萬(wàn)行)的表的場(chǎng)景而開(kāi)發(fā)的展哭。
這系列的引擎有:
- StripeLog
- 日志
- TinyLog
共同屬性
- 數(shù)據(jù)存儲(chǔ)在磁盤(pán)上湃窍。
- 寫(xiě)入時(shí)將數(shù)據(jù)追加在文件末尾。
- 不支持突變操作匪傍。
- 不支持索引您市。這意味著
SELECT
在范圍查詢時(shí)效率不高。 - 非原子地寫(xiě)入數(shù)據(jù)役衡。如果某些事情破壞了寫(xiě)操作茵休,例如服務(wù)器的異常關(guān)閉,你將會(huì)得到一張包含了損壞數(shù)據(jù)的表手蝎。
當(dāng)然他們之間也會(huì)有差異榕莺。
主要差異點(diǎn)
- Log和StripeLog引擎支持:
- 并發(fā)訪問(wèn)數(shù)據(jù)的鎖。
INSERT
請(qǐng)求執(zhí)行過(guò)程中表會(huì)被鎖定柑船,并且其他的讀寫(xiě)數(shù)據(jù)的請(qǐng)求都會(huì)等待直到鎖定被解除帽撑。如果沒(méi)有寫(xiě)數(shù)據(jù)的請(qǐng)求,任意數(shù)量的讀請(qǐng)求都可以并發(fā)執(zhí)行鞍时。 - 并行讀取數(shù)據(jù)亏拉。在讀取數(shù)據(jù)時(shí),ClickHouse使用多線程逆巍。每個(gè)線程處理不同的數(shù)據(jù)塊及塘。
Log引擎為表中的每一列使用不同的文件。StripeLog將所有的數(shù)據(jù)存儲(chǔ)在一個(gè)文件中锐极。因此StripeLog引擎在操作系統(tǒng)中使用更少的描述符笙僚,但是Log引擎提供更高的讀性能。
TinyLog引擎是該系列中最簡(jiǎn)單的引擎并且提供了最少的功能和最低的性能灵再。TinyLog引擎不支持并行讀取和并發(fā)數(shù)據(jù)訪問(wèn)肋层,并將每一列存儲(chǔ)在不同的文件中亿笤。它比其余兩種支持并行讀取的引擎的讀取速度更慢,并且使用了和Log引擎同樣多的描述符栋猖。你可以在簡(jiǎn)單的低負(fù)載的情景下使用它净薛。
集成的表引擎
ClickHouse 提供了多種方式來(lái)與外部系統(tǒng)集成,包括表引擎蒲拉。像所有其他的表引擎一樣肃拜,使用CREATE TABLE或ALTER TABLE查詢語(yǔ)句來(lái)完成配置。然后從用戶的角度來(lái)看雌团,配置的集成看起來(lái)像查詢一個(gè)正常的表燃领,但對(duì)它的查詢是代理給外部系統(tǒng)的。這種透明的查詢是這種方法相對(duì)于其他集成方法的主要優(yōu)勢(shì)之一锦援,比如外部字典或表函數(shù)猛蔽,它們需要在每次使用時(shí)使用自定義查詢方法。
以下是支持的集成方式:
- ODBC
- JDBC
- MySQL
- MongoDB
- HDFS
- S3
- Kafka
- EmbeddedRocksDB
- RabbitMQ
- PostgreSQL
- SQLite
- Hive
其他特殊的引擎
其他的表引擎用于特定的場(chǎng)景雨涛。具體使用什么引擎要根據(jù)具體的需求來(lái)分析枢舶。這里我們簡(jiǎn)單說(shuō)一下有哪些表引擎,具體使用情況替久,我們后面再更新。
- 分布式引擎:分布式引擎本身不存儲(chǔ)數(shù)據(jù),但可以在多個(gè)服務(wù)器上進(jìn)行分布式查詢躏尉。讀是自動(dòng)并行的蚯根。讀取時(shí),遠(yuǎn)程服務(wù)器表的索引(如果有的話)會(huì)被使用胀糜。
- 關(guān)聯(lián)表引擎:使用JOIN操作的一種可選的數(shù)據(jù)結(jié)構(gòu)颅拦。Join表的數(shù)據(jù)總是保存在內(nèi)存中。當(dāng)往表中插入行記錄時(shí)教藻,CH會(huì)將數(shù)據(jù)塊保存在硬盤(pán)目錄中距帅,這樣服務(wù)器重啟時(shí)數(shù)據(jù)可以恢復(fù)。如果服務(wù)器非正常重啟括堤,保存在硬盤(pán)上的數(shù)據(jù)塊會(huì)丟失或被損壞碌秸。這種情況下,需要手動(dòng)刪除被損壞的數(shù)據(jù)文件悄窃。簡(jiǎn)單來(lái)說(shuō)讥电,這個(gè)是一種對(duì)join操作的優(yōu)化的引擎。
- 內(nèi)存表:Memory 引擎以未壓縮的形式將數(shù)據(jù)存儲(chǔ)在RAM中轧抗。數(shù)據(jù)完全以讀取時(shí)獲得的形式存儲(chǔ)恩敌。換句話說(shuō),從這張表中讀取是很輕松的横媚。并發(fā)數(shù)據(jù)訪問(wèn)是同步的纠炮。鎖范圍性绿恕:讀寫(xiě)操作不會(huì)相互阻塞。不支持索引恢口。查詢是并行化的狮斗。在簡(jiǎn)單查詢上達(dá)到最大速率(超過(guò)10GB/秒),因?yàn)闆](méi)有磁盤(pán)讀取弧蝇,不需要解壓縮或反序列化數(shù)據(jù)碳褒。(值得注意的是,在許多情況下看疗,與 MergeTree 引擎的性能幾乎一樣高)沙峻。重新啟動(dòng)服務(wù)器時(shí),表中的數(shù)據(jù)消失两芳,表將變?yōu)榭账ふMǔ#褂么吮硪媸遣缓侠淼牟懒尽5鞘歉矗捎糜跍y(cè)試,以及在相對(duì)較少的行(最多約100,000,000)上需要最高性能的查詢竖螃。
- 隨機(jī)數(shù)生成表引擎:隨機(jī)數(shù)生成表引擎為指定的表模式生成隨機(jī)數(shù)淑廊。
- 緩沖區(qū):緩沖數(shù)據(jù)寫(xiě)入RAM中,周期性地將數(shù)據(jù)刷新到另一個(gè)表特咆。在讀取操作時(shí)季惩,同時(shí)從緩沖區(qū)和另一個(gè)表讀取數(shù)據(jù)。
- 字典:Dictionary引擎將字典數(shù)據(jù)展示為一個(gè)ClickHouse的表腻格。
- 用于查詢處理的外部數(shù)據(jù):ClickHouse允許向服務(wù)器發(fā)送處理查詢所需的數(shù)據(jù)以及SELECT查詢画拾。這些數(shù)據(jù)放在一個(gè)臨時(shí)表中,可以在查詢中使用(例如菜职,在IN操作符中)青抛。
- 文件(輸入格式):數(shù)據(jù)源是以Clickhouse支持的一種輸入格式(TabSeparated,Native等)存儲(chǔ)數(shù)據(jù)的文件酬核。
- MaterializedView:物化視圖蜜另,視圖的數(shù)據(jù)會(huì)物化到數(shù)據(jù)盤(pán)。
- 合并:Merge引擎(不要跟MergeTree引擎混淆)本身不存儲(chǔ)數(shù)據(jù)愁茁,但可用于同時(shí)從任意多個(gè)其他的表中讀取數(shù)據(jù)蚕钦。讀是自動(dòng)并行的,不支持寫(xiě)入鹅很。讀取時(shí)嘶居,那些被真正讀取到數(shù)據(jù)的表的索引(如果有的話)會(huì)被使用。
- Null:當(dāng)寫(xiě)入Null類型的表時(shí),將忽略數(shù)據(jù)邮屁。從Null類型的表中讀取時(shí)整袁,返回空。
- 集合:始終存在于RAM中的數(shù)據(jù)集佑吝。它適用于IN運(yùn)算符的右側(cè)坐昙。
- URL:用于管理遠(yuǎn)程HTTP/HTTPS服務(wù)器上的數(shù)據(jù)。該引擎類似文件引擎芋忿。
- 視圖:它不存儲(chǔ)數(shù)據(jù)炸客,僅存儲(chǔ)指定的SELECT查詢。從表中讀取時(shí)戈钢,它會(huì)運(yùn)行此查詢(并從查詢中刪除所有不必要的列)痹仙。