ClickHouse 与 Elasticsearch 对比分析
一、ClickHouse 详解
1.1 核心技术架构
列式存储(Columnar Storage)
ClickHouse 采用纯列式存储架构,数据按列而非按行组织存储。
存储结构:
| 文件类型 | 扩展名 | 作用 |
|---|---|---|
| 数据文件 | .bin | 存储列数据,使用压缩编码 |
| 标记文件 | .mrk | 记录列数据的偏移量,支持数据随机读取 |
| 主键索引 | .idx | 一级索引,用于快速定位数据块 |
核心优势:
行式存储: [Row1: id name amount date], [Row2: id name amount date], ...
ClickHouse列式: [id列: 1,2,3,...], [name列: a,b,c,...], [amount列: 100,200,300,...]
-
I/O优化:查询只读取所需列,避免全表扫描
-
假设表有100列,查询只涉及3列 → 只读取3%的数据
-
高压缩率:同列数据类型一致,压缩效率高
-
常用压缩算法:LZ4(快速)、ZSTD(高压缩)、Delta(数值型)
-
典型压缩比:10:1 ~ 30:1
-
向量化执行:利用CPU SIMD指令并行处理列数据
-
单指令多数据操作,大幅提升聚合计算效率
MergeTree 引擎(核心)
MergeTree 是 ClickHouse 的核心表引擎,设计用于处理海量数据的高效写入和查询。
数据写入流程:
写入 → Part1 (有序) → Part2 (有序) → ... → 后台Merge → 大Part
(小数据块) (小数据块) (合并优化)
核心机制:
- 数据分区(Partition):数据按分区键分组,支持分区裁剪
- 排序键(ORDER BY):数据在磁盘上按排序键顺序存储
- 数据 Parts:数据被分割成独立的 parts,每个 part 内部有序
分区设计示例:
CREATE TABLE orders (
order_id String,
product_id String,
amount Decimal(10,2),
created_at DateTime
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(created_at) -- 按月分区
ORDER BY (product_id, created_at) -- 商品+时间复合排序
数据类型体系
| 类型 | 范围/精度 | 存储大小 |
|---|---|---|
| Int8/16/32/64 | -2^n-1 ~ 2^n-1-1 | 1~8字节 |
| UInt8/16/32/64 | 0 ~ 2^n-1 | 1~8字节 |
| Float32/64 | IEEE 754 | 4/8字节 |
| Date | 1970-01-01 ~ 2106-02-07 | 2字节 |
| DateTime | 1970-01-01 ~ 2106-02-07 | 4字节 |
| Decimal(18,2) | 精确小数 | 9字节 |
| String | 任意长度 | 可变 |
| UUID | 128位 | 16字节 |
| LowCardinality | 大量重复值优化 | 高效 |
1.2 性能对比
ClickHouse vs MySQL
| 维度 | ClickHouse | MySQL | 差异 |
|---|---|---|---|
| 单表亿级聚合 | 0.3秒 | 30-300秒 | 快100-1000x |
| 压缩率 | 10-30:1 | 1-3:1 | 高10x |
| 写入吞吐 | 50-100MB/s | 1-5MB/s | 快10-50x |
| 跨年统计 | <1秒 | 10-60秒 | 快 |
| 适用场景 | OLAP分析 | OLTP事务 | 各有所长 |
ClickHouse vs StarRocks
| 维度 | ClickHouse | StarRocks | 说明 |
|---|---|---|---|
| 架构 | 本地存储 | FE+BE分离 | StarRocks更易扩展 |
| SQL兼容 | 有限 | MySQL协议 | StarRocks更友好 |
| 更新支持 | 弱 | 主键模型强 | StarRocks胜 |
| 单表聚合 | 更强 | 接近 | ClickHouse优 |
| 运维复杂度 | 高 | 较低 | StarRocks更易用 |
1.3 优缺点
✅ 优点
- 极致查询性能:列式存储+向量化执行,亿级数据秒级响应
- 高压缩率:列式存储压缩效率高,存储成本降低70%+
- 实时写入:写入即索引,高速批量写入
- 水平扩展:支持千亿级数据规模
- 丰富物化视图:多种 MergeTree 变种引擎
❌ 缺点
- 事务支持弱:无真正ACID事务,不支持回滚
- 更新删除性能差:普通 UPDATE/DELETE 是异步操作
- SQL支持不完整:无存储过程,无触发器
- 运维复杂:集群配置、副本管理门槛高
- JOIN优化较弱:复杂多表关联不如专业OLAP
1.4 适用场景
| 场景 | 适用度 | 说明 |
|---|---|---|
| 日志分析 | ⭐⭐⭐⭐⭐ | 完美胜任 |
| 订单/出入库统计 | ⭐⭐⭐⭐⭐ | 极强,适合统计场景 |
| 实时监控大屏 | ⭐⭐⭐⭐⭐ | 秒级响应 |
| 用户行为分析 | ⭐⭐⭐⭐⭐ | 多维聚合极强 |
| 交易系统/订单更新 | ⭐ | 不适合(更新性能差) |
| 强事务需求 | ⭐ | 不适合 |
1.5 中国用户案例
| 公司 | 规模 | 场景 |
|---|---|---|
| 字节跳动 | 数万台服务器 | 抖音日志分析,EB级数据 |
| 腾讯 | 数千台 | 微信数据、游戏分析 |
| 快手 | 数千节点 | 短视频推荐、直播分析 |
| 美团 | - | 实时数据看板 |
| 携程 | - | 用户行为分析 |
二、Elasticsearch 详解
2.1 核心技术架构
倒排索引(Inverted Index)
正向索引: 文档ID → 文档内容
倒排索引: 词(Term) → 文档ID列表
["华为","手机","性价比"] → [Doc1, Doc3, Doc7]
["苹果","手机","贵"] → [Doc2, Doc5]
搜索"手机" → 直接返回 [Doc1, Doc2, Doc3, Doc5, Doc7]
核心特性:
- 每个分片(Shard)是一个 Lucene 索引
- Segment:数据分段,每段内有序
- .tip/.doc/.tim 文件:倒排表、正向文档、词典
- Segment 不可变,后台异步合并
分片机制
Index → 5个Shard(分片)
├── Shard 1 (主分片) + Shard 1 Replica
├── Shard 2 (主分片) + Shard 2 Replica
└── ...
中文分词
- IK Analyzer:最常用,支持细粒度和智能分词
- ansj:基于 CRF 的中文分词
- 结巴分词(jieba):简单高效
2.2 性能对比
| 维度 | Elasticsearch | MySQL | 胜出 |
|---|---|---|---|
| 模糊搜索 | 极强(分词+倒排) | LIKE极慢 | ES |
| 全文检索 | 强 | 弱(FULLTEXT有限) | ES |
| 精确查询 | 弱(倒排索引不是最优) | 极强(B+Tree) | MySQL |
| 聚合统计 | ⚠️ 中等(7.x后改进) | 强(适合小数据) | MySQL |
| 水平扩展 | 极强 | 弱 | ES |
| 维度 | Elasticsearch | ClickHouse | 说明 |
|---|---|---|---|
| 搜索能力 | 极强 | 弱 | ES胜 |
| 聚合统计 | 中等 | 极强 | ClickHouse胜 |
| 写入性能 | 中等 | 高 | ClickHouse |
| 数据量 | 适合TB级 | 适合PB级 | ClickHouse |
2.3 优缺点
✅ 优点
- 全文搜索极强:中文分词(IK/ansj)支持
- 模糊匹配精准:纠错、同义词展开
- 水平扩展简单:新增节点自动负载均衡
- RESTful API:易集成到各类系统
- 近实时搜索:秒级数据可用
❌ 缺点
- 聚合统计一般:不如 ClickHouse,特别是多维度聚合
- 存储成本高:倒排索引占用空间大
- 数据一致性弱:最终一致模型
- 大数据量聚合慢:不适合 TB 级以上聚合分析
2.4 适用场景
| 场景 | 适用度 | 说明 |
|---|---|---|
| 全文搜索/模糊查询 | ⭐⭐⭐⭐⭐ | 完美胜任 |
| 商品搜索 | ⭐⭐⭐⭐⭐ | 适合商品模糊匹配 |
| 日志检索 | ⭐⭐⭐⭐⭐ | ELK 日志套件标配 |
| 订单统计 | ⭐⭐ | 不擅长(统计弱) |
| 时序分析 | ⭐⭐⭐ | 可用但非最优 |
三、针对你的场景如何选择
需求分析
| 需求 | 数据量 | 特点 |
|---|---|---|
| 商品数据 | 近百万条 | 主要是查询分析 |
| 订单数据 | 日均万单,年百万级 | 统计为主 |
| 出入库数据 | 类似订单量级 | 统计为主 |
| 模糊查询 | 需要 | 商品名模糊匹配 |
推荐方案
┌─────────────────────────────────────────────────────┐
│ 你的需求 │
├─────────────────────────────────────────────────────┤
│ 商品模糊搜索 → Elasticsearch ✅ │
│ 订单统计/分析 → ClickHouse ✅ │
│ 出入库统计 → ClickHouse ✅ │
│ 主库(MySQL) → 事务读写,完全隔离 │
└─────────────────────────────────────────────────────┘
方案一(经济型):只读实例 + ES(商品搜索)
[腾讯云MySQL主库] → [只读实例] → 简单分析查询
→ [CDC同步] → [ClickHouse] → 订单/出入库统计
→ [Elasticsearch] → 商品模糊搜索
方案二(极简型):只读实例撑住(先跑起来)
- 商品搜索:用 MySQL 的
LIKE或FULLTEXT(数据量百万内勉强能跑) - 订单统计:先用只读实例,按月分区查询
- 后续再按需加 ClickHouse
方案三(推荐长期最优):只读实例 + ClickHouse + ES
| 数据 | 存储 | 用途 |
|---|---|---|
| 商品表 | ClickHouse + ES | 统计 + 模糊搜索 |
| 订单表 | ClickHouse | 订单统计 |
| 出入库表 | ClickHouse | 统计 |
| MySQL主库 | 腾讯云CDB | 事务读写 |
四、成本估算(腾讯云)
| 组件 | 配置 | 月费用(参考) |
|---|---|---|
| MySQL只读实例 | 1核2G | ~60元 |
| ClickHouse(自建) | 4核8G 500G SSD | ~300元 |
| Elasticsearch | 2核4G 200G | ~400元 |
| 总计 | - | ~760元/月 |
五、总结
| 维度 | ClickHouse | Elasticsearch |
|---|---|---|
| 核心定位 | 分析型数据库 | 搜索引擎 |
| 最强项 | 大数据量聚合统计 | 全文搜索/模糊匹配 |
| 订单统计 | ✅ 极擅长 | ❌ 不擅长 |
| 商品搜索 | ⚠️ 一般 | ✅ 极擅长 |
| 数据量承受能力 | PB级 | TB级 |
| 推荐指数 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
针对你的需求:如果只能选一个,优先选 ClickHouse(订单统计是核心);如果预算允许,加一个 ES 做商品搜索。
六、关键技术参数参考
ClickHouse 核心配置
-- 表引擎配置
ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (id, date)
SETTINGS index_granularity = 8192;
-- 核心配置 (config.xml)
<max_threads>16</max_threads>
<max_memory_usage>10000000000</max_memory_usage>
<use_uncompressed_cache>1</use_uncompressed_cache>
Elasticsearch 分片配置
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"ik": {
"type": "ik",
"path": "ik"
}
}
}
}
}
文章生成时间:2026年4月30日