JJava 知识库
JAVA INTERVIEW

高频面试题

CK进阶约 1 分钟

ClickHouse 查询扫描太多数据时,你会不会加跳数索引?怎么判断它真的有效?

参考回答约 1 分钟 · 口语表达
我的判断

跳数索引只有当数据在 granule 内有可跳过的局部规律时才有价值;先看排序键和扫描分布,再用 read_rows 证明。

如果查询扫描太多,我先确认分区和 ORDER BY 是否匹配。排序键能从根本上让相近值聚集,优先级高于补跳数索引。像状态、错误码在局部数据块中分布稀疏,可以尝试 set/bloom/minmax;完全随机且每个 granule 都出现的字段,加索引也跳不过任何块。

我会在影子表或一个代表性分区上建索引并 materialize,用相同参数比较:

  • read_rowsread_bytes 和 marks 数;
  • 查询时间与索引判断 CPU;
  • 索引磁盘占用和写入/merge 开销;
  • 不同时间范围、稀有值和热门值的效果。

只有跳过比例稳定且总成本下降才推广。为了让 EXPLAIN 显示用了索引而增加写入成本,没有价值。

思路拆解问题分析

跳数索引不是 BTree 点查。它回答的是“这一大块数据肯定没有目标值吗”。数据越聚集、目标越稀疏,越可能跳过;数据均匀随机时效果通常很差。