ClickHouse 中的稀疏主索引是如何工作的?
ClickHouse 中的稀疏主索引有助于高效识别可能包含与查询在表主键列条件相匹配数据的粒度——即由多行组成的数据块。在下一节中,我们将说明该索引是如何根据这些列中的值构建的。
稀疏主索引的创建
在处理时,每一列的数据在逻辑上会被 ④ 划分为多个粒度——每个粒度包含 8,192 行——这是 ClickHouse 数据处理机制处理的最小单位。 这种粒度结构也是主索引之所以是稀疏的原因:ClickHouse 不会为每一行建立索引,而是 ⑤ 每个粒度只存储一行的主键值——更准确地说,是该粒度的第一行。因此,每个粒度都会对应一个索引条目:
得益于这种稀疏性,主索引足够小,可以完全装入内存,从而能够对主键列上带有过滤条件的查询进行快速过滤。在下一节中,我们将说明它如何帮助加速此类查询。
我们通过另一个动画来说明稀疏主索引如何用于加速查询:
① 示例查询同时包含针对两个主键列的谓词:
town = 'LONDON' AND street = 'OXFORD STREET'。
② 为了加速查询,ClickHouse 会将表的主索引加载到内存中。
③ 然后,它会扫描索引条目,以确定哪些粒度可能包含与该谓词匹配的行——也就是说,哪些粒度不能跳过。
④ 随后,这些可能相关的粒度会被加载到内存中,并与查询所需的其他列中对应的粒度一起进行处理。
监控主索引
关键要点
- 稀疏主索引通过识别哪些粒度中可能包含在主键列上满足查询条件的行,帮助 ClickHouse 跳过不必要的数据。
- 每个索引只存储每个粒度第一行的主键值 (一个粒度默认包含 8,192 行) ,因此结构足够紧凑,可以放入内存。
- MergeTree 表中的每个数据分区片段都有自己的主索引,并在查询执行期间独立使用。
- 在查询过程中,索引可让 ClickHouse 跳过粒度,从而减少 I/O 和内存占用并提升性能。
-
你可以使用
mergeTreeIndex表函数来查看索引内容,并通过EXPLAIN子句监控索引的使用情况。