ClickHouse 查询扫描太多数据时,你会不会加跳数索引?怎么判断它真的有效?
我的判断
跳数索引只有当数据在 granule 内有可跳过的局部规律时才有价值;先看排序键和扫描分布,再用 read_rows 证明。
如果查询扫描太多,我先确认分区和 ORDER BY 是否匹配。排序键能从根本上让相近值聚集,优先级高于补跳数索引。像状态、错误码在局部数据块中分布稀疏,可以尝试 set/bloom/minmax;完全随机且每个 granule 都出现的字段,加索引也跳不过任何块。
我会在影子表或一个代表性分区上建索引并 materialize,用相同参数比较:
read_rows、read_bytes和 marks 数;- 查询时间与索引判断 CPU;
- 索引磁盘占用和写入/merge 开销;
- 不同时间范围、稀有值和热门值的效果。
只有跳过比例稳定且总成本下降才推广。为了让 EXPLAIN 显示用了索引而增加写入成本,没有价值。
思路拆解问题分析
跳数索引不是 BTree 点查。它回答的是“这一大块数据肯定没有目标值吗”。数据越聚集、目标越稀疏,越可能跳过;数据均匀随机时效果通常很差。