一份英国房地产交易记录,三十百四十五万行。一次查询没配好索引,全表硬扫,等了半天。ClickHouse 团队认得很死:最快的分析查询,永远是那些读数据量最少的查询。这不是口号,是铁律。
下面就拿这个数据集当靶子,拆解三种索引修剪武器——什么时候拔哪把,一看便知。
![]()
要点一:主键索引,最直接的剪枝斧。表里的数据按主键排序,再切成一个个数据粒,每粒默认塞8192行。主索引只记录每个粒第一行的主键值。查询条件里带主键列过滤,引擎一眼就能瞄出哪些粒碰都不用碰。比如主键列 C1 上走 WHERE C1 > 60,前两个粒的值全在60以下,直接砍掉,只读剩下的粒。
![]()
要点二:轻量级投影,给非主键列挂上副目录。ClickHouse 25.6 开始引入,26.1 语法更好看了。传统投影会偷偷复制整份数据,按不同排序存,磁盘压力不小。轻量级投影学乖了:只保留排序键和一个 _part_offset 指针,指回原表该行的位置。遇到非主键列的过滤,比如 WHERE C2 > 900,它能用自己的主索引剪枝,再靠指针去原表拿其它需要的列,不复制全部字段。
要点三:跳过索引 minmax,省地方但要挑跟主键的“联动性”。minmax 索引给每个数据粒存下该列的最小值和最大值。ClickHouse 支持这招五年多,最近更自动给符合类型的列自动建这类索引。好处是不重复存列值,但前提是这列得跟主键的排序相关——不相关的话,跳过效果就没了。比如 C3 列上过滤 C3 > 600,前三粒的最大值全不到 600,直接跳过,只读 g4。轻量级投影是另修一条路,minmax 则是沿途插限高杆,成本更低,但只管高度限制。
![]()
要点四:上手建表有门道。表用 MergeTree 引擎,主键设成 (postcode1, postcode2, addr1, addr2)。字段里邮编、街道、地区用 LowCardinality 省空间,类型用枚举。数据先从 CSV 转成 Parquet 再吞入,一次导入 3045 万行只花了 5 秒多,峰值内存不到 774 兆。明面上是个中等规模表,但接下来用 ATTACH PARTITION 复制数据分块,几次翻倍,转眼就能堆出足够的行术来测索引效果。
要点五:ATTACH PARTITION 自复制扩容术。不想重复导入 Parquet?一行命令 ALTER TABLE ... ATTACH PARTITION ID ‘all’ FROM 同表,就把所有分块全量复印一遍,数据量滚雪球。跑几次,行数迅速膨胀,省时省力,为后面压测不同修剪策略备足料。这步本身就是 ClickHouse 数据管理的一把快刀。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.