JJava 知识库
JAVA INTERVIEW

高频面试题

CK高级约 1 分钟

ClickHouse 集群查询时,Distributed 表怎么选分片键?如何避免数据倾斜?

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

分片键要让写入均匀并尽量让高频查询落单片;选择后还要用最大/平均负载和跨片比例持续验证。

订单或用户事件常用稳定业务键哈希,例如 cityHash64(user_id),同一用户落同一分片,用户查询可带分片键路由,整体分布也比较均匀。不能用低基数地区,也不能用当前日期简单取模,否则热点会集中到少数分片。

我会回放 Top 查询,看有多少能携带分片键。跨全局聚合本来就要访问所有分片,但高频点查如果每次广播,分片越多延迟和资源越差。必要时为另一查询维度构建独立聚合表,而不是让所有需求共用一张分布式表。

上线前用真实键分布计算每片行数、字节和 QPS,特别模拟超级用户。监控最大/平均负载比、远程读取、最慢分片和写入队列。

扩容后旧数据不会自动按新规则完美重排,需要明确新写路由、历史迁移和查询兼容期。分片键不是只影响今天建表,还决定未来扩容成本。

容易答偏踩坑误区
  • 用随机分片换绝对均匀。 同一用户查询会被迫广播。
  • 只看平均分布。 少数超级租户足以拖垮一个分片。
  • 认为加节点后旧数据自动平衡。 迁移与路由兼容需要单独设计。