一、ClickHouse 的優缺點
一、ClickHouse 的優點 ?
1. 極致的查詢性能
- 列式存儲:只讀取查詢涉及的列,大幅減少 IO。
- 數據壓縮:常見壓縮率 5~10 倍,減少存儲和帶寬消耗。
- 向量化執行:按批次(block)處理數據,充分利用 CPU SIMD 指令。
- 并行查詢:單機多核 + 集群分布式并行。
👉 結果:在 TB~PB 級數據量上,秒級甚至毫秒級返回復雜聚合查詢。
2. 實時寫入 + 即時可查
- 支持高并發寫入(百萬級/秒),數據寫入后幾乎立即可查詢。
- 比 Hive、Presto 這類 批處理查詢引擎 要快得多。
👉 適合 實時數據分析、監控、日志查詢。
3. 分區、索引、分布式能力
- 主鍵索引 (Sparse Index):按分區范圍做稀疏索引,快速定位數據。
- 數據分區/分片 (Sharding & Partitioning):支持海量數據水平擴展。
- 副本 (Replication):保證高可用和容災。
👉 可以支撐 大規模集群部署。
4. 豐富的數據引擎
- MergeTree 系列:主力 OLAP 存儲。
- 外部數據源引擎:MySQL、Kafka、HDFS、S3、Postgres、MongoDB 等。
- Buffer、MaterializedView:支持實時 ETL。
👉 在 冷熱數據分層、與大數據生態結合 方面很靈活。
5. 開源 + 活躍生態
- Apache 2.0 協議,社區活躍。
- 已在 Yandex、騰訊、美團、字節跳動等大規模落地。
- 生態中有 Kafka、Spark、Flink、Airflow 等連接器。
6. 運維成本相對較低
- 單機就能跑得很好,部署門檻低。
- 不依賴 Hadoop 生態(相比 Hive/Presto)。
- 對比 Druid、Kylin,運維復雜度更低。
二、ClickHouse 的缺點 ??
1. 不適合事務場景
- 沒有完整的 ACID 事務,僅支持有限的 原子性操作 (Atomic engine)。
- 不適合 OLTP(銀行轉賬、電商訂單等強一致性場景)。
👉 它是 OLAP 系統,定位是分析,而不是事務處理。
2. 寫入刪除機制有限
- 刪除 (DELETE/UPDATE) 操作本質上是 標記刪除,數據會在后臺合并時真正清理。
- 寫入是 批量塊 (block),小量頻繁寫入效率較差。
👉 適合 append-only 的場景(日志、監控),不適合頻繁更新。
3. 學習曲線
- 引擎種類多(MergeTree 系列、Log、Buffer…),新手需要理解其差異。
- SQL 方言與標準 SQL 有些差別,比如
LIMIT BY
、SAMPLE
、FINAL
等。
4. 資源消耗
-
極致性能是通過 CPU、內存換取的:
- 查詢時常常消耗大量內存。
- 并發查詢太多時可能出現 OOM。
-
高性能存儲介質(SSD/NVMe)更適合 ClickHouse,否則性能會打折扣。
5. 生態相對不如傳統數據庫
- BI 工具支持在增強,但相比 MySQL/Postgres 還是稍弱。
- 機器學習、流處理生態,需要依賴 Spark/Flink 來補充。
6. 集群管理復雜性
-
雖然單機簡單,但大規模集群下:
- 表分片、副本、分布式查詢路由,需要良好設計。
- 運維經驗不足時容易遇到 數據傾斜、分片不均衡 的問題。
三、總結表格
方面 | 優點 | 缺點 |
---|---|---|
性能 | 秒級/毫秒級查詢,列存+壓縮+向量化 | 高并發查詢時內存占用大 |
寫入 | 高吞吐實時寫入 | 不適合頻繁更新/刪除,小批量寫入低效 |
事務 | 支持原子表 | 缺乏完整 ACID,不能做 OLTP |
架構 | 分布式、分片、副本、高可用 | 集群管理復雜 |
生態 | 外部引擎豐富,社區活躍 | BI/ML 生態不如 MySQL/PG 豐富 |
運維 | 單機簡單,依賴少 | 大規模集群需要專業經驗 |
📌 一句話總結
ClickHouse = 高性能 OLAP 引擎,適合日志分析、指標監控、用戶行為分析、大數據實時查詢;
不適合 事務處理、頻繁更新刪除、強一致性場景。
二、存儲引擎 (Table Engines)
1. 核心概念
在 ClickHouse 里,表引擎 (Table Engine) 決定了表的數據如何存儲、分布、復制、合并以及如何被查詢。
- 有些引擎是 存儲型(比如
MergeTree
),真的把數據落盤。 - 有些是 視圖型(比如
View
),不存儲數據,只做查詢映射。 - 有些是 外部數據源型(比如
MySQL
、Kafka
、HDFS
),數據存在別處。
2. 主流存儲引擎類別
(A) MergeTree 系列(最常用、最強大)
這是 ClickHouse 的核心存儲引擎族,支持 索引、分區、TTL、壓縮、并行查詢 等特性。
常見子類:
MergeTree
:基礎版本。ReplacingMergeTree
:支持用指定列替換重復數據。SummingMergeTree
:自動對相同 key 的數據做聚合(求和)。AggregatingMergeTree
:支持存儲預聚合數據(配合AggregateFunction
)。CollapsingMergeTree
:支持“折疊”正負標記的數據(常用于 CDC、日志)。VersionedCollapsingMergeTree
:帶版本號的折疊,解決數據順序問題。GraphiteMergeTree
:專門為 Graphite 監控數據設計(支持 rollup)。
👉 特點:適合絕大多數 OLAP 場景,是 ClickHouse 的主力。
(B) 日志型引擎(簡單輕量)
不做復雜的合并和索引,性能和功能有限,適合小表、臨時表。
Log
:簡單的日志表。StripeLog
:數據按列分 stripe 存儲。TinyLog
:最簡單的存儲形式,寫入文件,幾乎沒有額外功能。
👉 常見于測試、小規模表。
? 內存型引擎
Memory
:數據全在內存里,重啟會丟失,適合臨時計算。
(D) 外部數據源 / 文件系統引擎
File
:讀寫本地文件(支持 CSV、TSV、Parquet、ORC 等)。HDFS
:讀寫 HDFS 文件。S3
:讀寫 AWS S3 或兼容的對象存儲。URL
:直接通過 HTTP/HTTPS 訪問遠程文件。MySQL
:把 MySQL 表映射為 ClickHouse 表。PostgreSQL
:訪問 PostgreSQL 數據。ODBC
/JDBC
:通過 ODBC/JDBC 訪問外部數據庫。Kafka
:從 Kafka 消費數據。RabbitMQ
:從 RabbitMQ 讀寫數據。MongoDB
:訪問 MongoDB 數據。
👉 適合做 外部數據源接入、ETL、實時數據攝取。
(E) 分布式 / 集群引擎
Distributed
:把表分布到多個 ClickHouse 節點,支持分布式查詢。Dictionary
:存儲字典數據(常用于維表 join)。
(F) 特殊用途引擎
Null
:丟棄所有寫入,查詢時返回空結果(類似/dev/null
)。View
:普通視圖,不存儲數據。MaterializedView
:物化視圖,存儲查詢結果。LiveView
:實時視圖,支持訂閱數據變化。Join
:專門存儲用于 JOIN 的數據。Set
:存儲一個集合,用于IN
查詢。Buffer
:數據先寫入內存緩沖區,再異步落到目標表。Merge
:將多個表合并為一個邏輯表。Dictionary
:存儲字典型數據(維表)。
3. 總結
ClickHouse 的引擎大致可以分為幾類:
類別 | 代表引擎 | 主要用途 |
---|---|---|
核心存儲 | MergeTree 系列 | 高性能 OLAP,分區、索引、壓縮 |
輕量存儲 | Log、TinyLog、StripeLog | 小表、臨時表 |
內存 | Memory | 臨時計算 |
外部數據 | File、HDFS、S3、MySQL、Kafka | 數據交換、ETL、實時導入 |
分布式 | Distributed | 集群查詢 |
特殊用途 | Null、View、MaterializedView、Join、Buffer | 特殊場景 |