1. MergeTree 主引擎支持主键排序与稀疏索引
请解释 ClickHouse 最基础的 MergeTree 表引擎如何利用主键排序与稀疏索引来加速查询,并说明其索引的组织方式?
- MergeTree 是 ClickHouse 的基石引擎,理解其主键(ORDER BY)与稀疏索引机制
- 稀疏索引与稠密索引的区别,以及为何适合列存分析场景
- 主键排序如何影响数据写入与查询裁剪
MergeTree 是 ClickHouse 最核心的存储引擎,它通过 ORDER BY 指定排序键,数据在写入时按该键排序后存储。主键索引采用「稀疏索引」方式:每 8192 行(默认 index_granularity)生成一个索引标记(mark),索引文件只记录每个 granule 的第一行主键值,而非每一行的索引。查询时根据主键条件通过二分查找确定命中范围,再通过 mark 定位到对应的 part 文件区间进行读取。由于是稀疏索引,合并两个有序数据流后仍保持有序,因此即使频繁插入,每个 part 内部也是有序的。
稀疏索引在分析型工作负载下极具优势:插入时只需维护有序,无需为每一行建立索引,极大降低写放大;而分析查询通常扫描大量数据,稀疏索引配合分区裁剪与列裁剪能过滤掉大量无关数据。相比 MySQL 的 B+ 树稠密索引,稀疏索引更偏向「排序 + 前缀裁剪」的读取模型,牺牲了点查的定位精度,换取了高吞吐顺序扫描。
CREATE TABLE events (
event_date Date,
user_id UInt64,
event_type String
) ENGINE = MergeTree
ORDER BY (event_date, user_id)
SETTINGS index_granularity = 8192;