真实给一张500万行表的普通列加minmax跳数索引,用EXPLAIN indexes=1对比加索引前后同一条查询真实扫描的granule数量差异。
代码CREATE TABLE demo.skip1 (k UInt64, v UInt64) ENGINE=MergeTree ORDER BY k; INSERT INTO demo.skip1 SELECT number, number%1000000 FROM numbers(5000000); EXPLAIN indexes=1 SELECT count() FROM demo.skip1 WHERE v=42; -- 加索引前 ALTER TABLE demo.skip1 ADD INDEX idx_v v TYPE minmax GRANULARITY 4; ALTER TABLE demo.skip1 MATERIALIZE INDEX idx_v; -- 真实为已有数据补建索引 EXPLAIN indexes=1 SELECT count() FROM demo.skip1 WHERE v=42; -- 加索引后
EXPLAIN indexes=1 SELECT count() FROM demo.skip1 WHERE v=42;
→ ReadFromMergeTree (demo.skip1)
Parts: 4 | Granules: 544 ← 真实544个granule全部进入扫描
Indexes:
PrimaryKey
Condition: true
Parts: 4/4
Granules: 544/544 ← v不是排序键,主键索引真实帮不上忙v列不是ORDER BY k的一部分,主键索引对它完全无能为力,Condition: true意味着主键索引对这次查询没有提供任何过滤信息,544个granule真实一个都没被排除。
EXPLAIN indexes=1 SELECT count() FROM demo.skip1 WHERE v=42;
→ ReadFromMergeTree (demo.skip1)
Parts: 4 | Granules: 20 ← 真实从544降到20
Indexes:
Skip
Name: idx_v
Description: minmax GRANULARITY 4
Condition: (v in [42, 42])
Parts: 4/4
Granules: 20/544 ← 真实排除了524个granule,降了约27倍每一步都是本文上面用真实EXPLAIN indexes=1跑出来的原始结果。
ALTER TABLE ADD INDEX / MATERIALIZE INDEXEXPLAIN indexes=1 Skip索引裁剪结果对比