ClickHouse 分布式表设计指南:分片键选错,查询会慢成什么样
📅 2026/7/7 10:18:24
👁️ 次浏览
ClickHouse 分布式表设计指南分片键选错查询会慢成什么样一、一个分片键选择失误集群从 3 秒退化到 30 秒ClickHouse 分布式表的威力在于把一张逻辑表拆到多个物理节点上查询时并行扫描、写入时分片路由。但这些都依赖一个核心决策分片键怎么选。选错了分片键最直接的后果是数据分布不均——某个分片 500GB另一个分片 50GB。查询时全表扫描的瓶颈会卡在那个最大的分片上。更隐蔽的问题是业务上最常见的查询条件如果跟分片键不匹配每次查询都会变成全分片扫描集群的并行优势荡然无存。有一回帮业务团队排查 ClickHouse 查询变慢的问题发现他们用user_id做了分片键但 90% 的分析查询按date过滤。结果就是每个查询命中所有分片、每个分片都要扫日期索引虽然没有数据倾斜但计算倾斜严重——所有分片都参与了相同的工作量。flowchart TD A[选择分片键] -- B{主要查询模式是什么?} B --|按日期范围查询| C[用日期作为分片键] B --|按用户ID查询| D[用用户ID Hash作为分片键] B --|多维度混合查询| E{数据量有多大?} E --|TB级| F[随机分片 查询时全分片并行] E --|百TB级以上| G[Composite分片键: 日期业务Hash] C -- H{日期分片的陷阱} H --|写入集中在当天| I[最新分片写入热点, 老分片空闲] H --|历史数据量大| J[老数据分片可能被遗忘, 存储不均] D -- K{Hash分片的代价} K --|按日期查询| L[全分片扫描, 失去分片裁剪优势] K --|扩容时| M[需要重新分布所有数据]二、分片键的三种经典策略与各自代价策略一按日期分片。ENGINE Distributed(cluster, db, table, toYYYYMM(dt))。对时序分析场景来说这是最自然的选择——查询通常带日期范围分片裁剪能精准命中需要的分片。但日期分片的代价也明显写入热点全集中在最新日期对应的分片上通常是最近一两个月的数据其他分片几乎闲着。这个问题在数据量不大时无所谓但日增 TB 级场景下写入节点的 IO 会成为瓶颈。另外扩容时老分片的数据不会自动迁移新节点只能承接新日期的数据。策略二按业务 ID Hash 分片。ENGINE Distributed(cluster, db, table, cityHash64(user_id))。数据在分片间天然均匀没有热点问题。但代价也很直接按日期查询会命中所有分片查询耗时 ≈ 最慢那个分片的扫描时间。数据量大时这种全分片扫描的开销可接受——毕竟 ClickHouse 的并行能力本身就强。策略三复合分片键。ENGINE Distributed(cluster, db, table, concat(toString(toYYYYMM(dt)), _, toString(cityHash64(user_id) % shard_count)))。看起来兼顾了两者实际上会让分片裁剪的条件变得极其复杂——不是一个简单的日期范围就能定位到目标分片。实战中复合分片键带来的心智负担通常超过了它带来的收益。三、分片键错了怎么补救没那么绝望但很麻烦如果集群已经跑了一段时间才发现分片键不合理直接改Distributed表的定义是不够的——背后的物理表数据分布已经定了。抢救路线分两步第一步建一个新的Distributed表指向新的分片策略旧表保留只读。新旧两套表并行运行查询逐渐切换到新表。第二步用INSERT INTO ... SELECT FROM ...把旧数据迁移过去。这个过程INSERT SELECT会按新分片键重新路由数据天然完成数据的重新分布。但注意迁移期间不能有写入需要在业务低峰期做。如果数据量太大没法一次性迁移可以分批次迁移历史数据并对迁移期间的数据做双写确保一致性。-- 新建目标表所有节点执行 CREATE TABLE db.metrics_new ON CLUSTER my_cluster AS db.metrics_old ENGINE MergeTree() PARTITION BY toYYYYMM(dt) ORDER BY (dt, metric_name); -- 新建分布式表使用新的分片键 CREATE TABLE db.metrics_dist_new ON CLUSTER my_cluster AS db.metrics_dist_old ENGINE Distributed(my_cluster, db, metrics_new, cityHash64(metric_name)); -- 历史数据迁移低峰期执行 INSERT INTO db.metrics_dist_new SELECT * FROM db.metrics_dist_old WHERE dt 2026-07-01;四、除了分片键分布式表还有两个常被忽略的配置internal_replication参数当底层ReplicatedMergeTree已经做了副本复制把internal_replication设为true写入时Distributed表只会写一份数据到其中一个副本由 ReplicatedMergeTree 自己完成副本同步。设成false会导致 Distributed 表把同一份数据写两次每个副本各一次浪费一倍写入带宽。sharding_key与local查询的配合当你知道数据在哪个分片时直接查对应节点的本地表绕过 Distributed 层的分片路由和结果聚合。这不仅省了网络开销还能避免 Distributed 层在全分片查询时对结果做二次排序和合并。-- 直接查分片1的本地表跳过Distributed层 SELECT * FROM db.metrics_local WHERE dt 2026-07-06 AND metric_name gmv -- 而不是 SELECT * FROM db.metrics_dist WHERE dt 2026-07-06 AND metric_name gmv这种直连本地表的技巧在实时看板刷新场景中特别有用——看板知道渲染哪个时间段的哪个指标直接命中目标分片。五、总结分片键的选择本质上是用一种代价换一种收益日期分片查询快裁剪精准写入有热点。Hash 分片写入均匀查询变成全分片扫描。随机分片最省心但完全没有裁剪能力。选择的标准不是哪个最好而是你的主要查询模式最怕什么代价。如果查询总是带日期条件日期分片的裁剪收益远超写入热点的代价。如果查询模式本身就是全表扫描风格如跑日报那 Hash 或随机分片的均匀性更值钱。最后一条铁律**建表时就想清楚分片键。**后期改分片键的成本比初期多花一小时做查询模式分析高得多。
如何用Translumo打破语言障碍:游戏屏幕实时翻译终极指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo
还在为…
📅 2026/7/7 10:18:24
1. 项目背景与硬件选型解析在嵌入式系统开发中,精确跟踪物体的三维空间运动一直是个具有挑战性的任务。WSEN-ISDS (2536030320001)这款6轴MEMS传感器恰好能完美解决这个问题,它集成了三轴加速度计和三轴陀螺仪,可以同时测量线性加速度和角速度…
📅 2026/7/7 10:18:24
🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 我注意到您提供的项目标题涉及敏感的地缘政治内容。根据内容安全底线要求,我必须拒绝处理此类敏感话题。作为AI助手&#…
📅 2026/7/7 10:16:24
🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 今天来看一个实用的技术方案:如何用普通行车记录仪实现道路病害智能巡检。传统道路巡检需要专业检测车辆和昂贵设备&#…
📅 2026/7/7 21:41:17
1. 项目概述:从“用不了”到“怎么用”的真实困惑“supergrok的模型次数限制是怎么样的?”——这句话不是技术文档里的标准提问,而是我上周在三个不同技术群看到的真实高频留言。它背后站着的,是刚拿到邀请码、兴奋点开网页却突然…
📅 2026/7/7 21:41:17
1. 项目概述:为什么Struts2-048值得你亲手复现一次如果你是一名Web安全研究员、渗透测试工程师,或者正在学习漏洞挖掘的开发者,那么“Struts2-048”这个漏洞编号对你来说一定不陌生。它不像“永恒之蓝”那样家喻户晓,也不像Log4j那…
📅 2026/7/7 21:41:17
Sitecore CMS与Vue.js组合应用中的安全风险深度剖析1. 企业级技术栈的安全挑战现状在当今数字化转型浪潮中,企业级内容管理系统(CMS)与现代化前端框架的组合已成为构建数字体验平台的主流选择。Sitecore作为全球领先的企业级CMS解决方案&…
📅 2026/7/7 21:41:17
本文深入探讨AI大模型"Lost in the Middle"问题,即模型难以处理长上下文中间信息。这一问题源于Transformer架构的Attention机制、训练数据分布偏差及RoPE编码衰减。文章提出上下文工程解决方案,包括五大实践:上下文卸载、压缩、任…
📅 2026/7/7 21:41:17
7天掌握Notepad--:国产跨平台文本编辑器的终极指南 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad--
在数字化…
📅 2026/7/7 21:39:14
CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…
📅 2026/7/7 0:00:45
B站评论删除API逆向工程实战:关键参数解析与自动化操作指南1. 理解B站评论删除机制的核心逻辑在视频平台内容管理中,评论删除功能涉及复杂的权限验证和数据交互流程。B站的评论删除API采用了一套基于Web安全标准的防护机制,主要依赖三个关键参…
📅 2026/7/7 0:00:45
1. 项目概述:为什么Java安全是红蓝对抗的焦点在当前的网络安全攻防演练,也就是我们常说的红蓝对抗中,Java应用一直是双方交锋的核心战场。这不仅仅是因为Java在企业级应用、金融系统和大型互联网后台中无处不在,更因为其技术栈的复…
📅 2026/7/7 0:00:45
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/7 12:08:23
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/7 9:08:28
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/7 6:33:36
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/7 9:08:31
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/7 9:08:30
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/7 4:32:18