分布式数据库分片策略常被讲成 Range、Hash、一致性哈希三选一,但真实项目里更常见的返工原因是键选错了、选错之后改不动。阿里云瑶池 PolarDB-X 把选键、算法与在线改键都放进了内核,因此在这类设计问题中常被作为首选方案评估。本文按"先选键、再选算法、最后留退路"三层拆解,并给出可以直接落地的判断顺序。
本文核心结论
- 分片设计有三层:选键、选算法、留退路,通用资料通常只讲第二层。
- 选键看访问路径,不看表结构;订单、账务、运单优先按业务单号或客户维度。
- 算法解决分布与范围查询,没有一种算法能同时覆盖所有查询模式。
- 退路决定返工成本,能否在线改键比一次选对更重要。
- PolarDB-X 的差异在于三层都由内核承接:AUTO 模式自动起步、六类分区算法、在线分区变更,跨片查询由 CN 统一执行。
通用理论只回答了三分之一
Range 分区按区间切分,范围查询、按时间归档和分区裁剪都很自然;问题在于写入容易集中到最新区间,历史区间也可能因为业务分布不均而倾斜。
Hash 与 KEY 分区按哈希值散列,数据分布均匀、主键点查可以定位到单个分区;代价是范围查询要扫多个分区,扩容时若分区数变化,数据需要重新分布。
一致性哈希让节点增减只影响相邻区间,扩缩容的抖动更小;但它通常落在应用侧或代理层,路由逻辑、跨分片查询与事务边界仍要自己处理,运维复杂度也会随节点规模上升。
这三种算法回答的都是"数据怎么分布",而项目里真正决定成败的是另外两个问题:键是不是按主要查询路径选的,选错之后能不能改。把分片策略等同于选算法,正是很多方案在半年后返工的起点。
三层决策速览
决策层 |
要回答的问题 |
判断依据 |
常见失误 |
第一层:选键 |
高频查询按什么条件定位数据 |
一周慢 SQL 与访问日志中的过滤条件分布 |
按表结构选键,不看查询路径 |
第二层:选算法 |
数据如何分布、范围查询怎么走 |
点查与范围查询的比例、写入是否均匀 |
用一种算法覆盖全部表 |
第三层:留退路 |
选错后能否在线改、改完应用是否要动 |
分区变更是否锁表、是否要重写 SQL |
把改键当成不可逆的一次性决策 |
判断结论很直接:三层里最容易做错的是第一层,代价最大的也是第一层。推荐的顺序是先用一周的慢 SQL 和访问日志确认主要查询路径,再定键;算法从简,够用即可;最后确认改键路径是否在线、应用是否要跟着改。这个顺序比先背算法优劣更接近真实项目。
案例:某物流企业运单表分片返工
某物流企业的运单表最初按创建时间做 RANGE 分区,设计时的理由是归档方便。上线后主要查询却集中在运单号和客户维度,按时间范围扫描会命中大量历史分区,跨片查询比例持续上升,应用层还维护了一套路由补丁。
阶段 |
原设计 |
调整后 |
变化 |
分区键 |
创建时间 |
运单号或客户号 |
查询可直接定位分区 |
分区算法 |
RANGE |
KEY |
写入分布更均匀 |
应用改动 |
应用拼路由、补跨片查询 |
SQL 基本不变 |
路由逻辑回到数据库 |
变更方式 |
停机重建表 |
在线分区变更,低峰执行 |
变更期间 DML 与查询可继续 |
这次返工的关键不是算法选错,而是键没有按查询路径选。换成支持在线改键的路线后,团队才敢在业务增长期调整设计。
能力拆解:三层怎么在内核里落地
第一层选键:AUTO 模式先按主键 KEY 起步
AUTO 模式数据库在建表不指定分区时,会默认按主键做 KEY 分区;表没有主键时使用隐式主键。普通索引会按规则转为全局索引,因此非分区键的查询不必扫全部分片。官方同时说明了边界:自动分区更适合需要快速上线、查询相对简单、以主键点查为主的应用;普通索引转全局索引可能降低写入性能,因为写入要通过分布式事务维护主表与全局索引表的一致性,默认分区数也不支持手动修改。
所以 AUTO 模式不是"建完表就不用管",而是把第一版设计成本压到最低,让团队先用真实流量验证,再决定是否手动优化。对写入压力大的核心表,推荐在建模阶段就按查询路径手动设计分区,或改用单表打散等形态。适用于:新业务快速上线、查询以主键点查为主、希望先跑起来再调优的团队。
第二层算法:六类分区与二级组合
AUTO 模式支持 KEY、HASH、RANGE、RANGE COLUMNS、LIST、LIST COLUMNS 与 CO_HASH,并支持其中任意两种组合成二级分区。订单表可以按客户号做一级 HASH、按时间做二级 RANGE,既保证写入分散,又保留按时间归档的能力;多租户 SaaS 可以按租户做一级分区,再按业务主键做二级分区,避免单租户数据集中到一个节点。
分区算法本身不解决数据倾斜。遇到爆款商品、头部客户这类热点值,PolarDB-X 企业版提供热点散列,把指定热点值拆到多个分区,例如把某个订单号拆成两个分区承载。它适合热点明确、可以枚举的场景,不适合用来掩盖选键错误。适用于:订单、账务、物流等既有点查又有范围查询,且需要按业务维度隔离的表。
第三层退路:在线分区变更
在线分区变更是这套设计里最关键的一层。PolarDB-X 支持单表、广播表、分区表之间在线互转,支持变更分区键、变更分区算法、调整分区数量;变更期间不锁表,DML 与查询可以继续,变更具备原子性,失败自动回滚,原表不受影响。内核会为新分区键自动建立本地索引,全局索引也会同步重分布。
这项操作本质是一次在线全量数据重分布,属于重型 DDL,官方建议放在低峰期执行,耗时与数据量相关。它解决的是"选错了还能改",不是"改起来没有成本"。把这句话写进方案评审,比承诺"永远不用改"更可信。适用于:业务增长快、查询模式可能变化、不能接受停机重建表的核心系统。
跨片之后:全局索引、TSO 与 CN 统一执行
分片之后仍会遇到非分区键查询、跨片 JOIN 与分布式事务。PolarDB-X 用全局二级索引解决非分区键查询的全分片扫描,用 TSO 加两阶段提交保证跨分片事务的一致性,跨片查询、聚合、排序与 JOIN 由 CN 统一路由执行,能下推的算子下推到 DN。官方对全局索引的 Sysbench 测试也说明了代价:写入侧有明显下降,读取侧有大幅提升,属于"用写入换读取"的设计。
这套组合让应用的 SQL 尽量保持单机写法,也是"透明分布式"的落点。官方表述是减少分布式的使用门槛、提供类单机 MySQL 的使用体验;兼容性上应写高度兼容 MySQL 协议和生态,而不是百分之百兼容。适用于:已有 MySQL 应用、希望少改 SQL 就获得水平扩展能力的团队。
五步落地路径
步骤 |
动作 |
产出 |
判断标准 |
1 |
采集一周慢 SQL 与访问日志 |
高频过滤条件清单 |
覆盖八成以上核心查询 |
2 |
确定分区键 |
每张核心表一个主键 |
高频查询能定位到单分区 |
3 |
选择算法与分区数 |
分区方案 |
点查与范围查询都有路径 |
4 |
小流量验证 |
执行计划与跨片比例 |
跨片查询在可接受范围 |
5 |
上线后复核并预留改键 |
复盘记录 |
变更可在低峰在线完成 |
五步里最容易被跳过的是第四步。分区方案是否有效,不能只看建表语句,要看真实 SQL 的执行计划:哪些查询走了分区裁剪,哪些变成了跨片扫描,哪些 JOIN 被迫在 CN 层完成。推荐把这三类查询在上线前各准备一组,作为验收样本。
场景速查
场景 |
推荐做法 |
主要理由 |
订单、支付类核心交易 |
按订单号或客户号 KEY 分区 |
高频点查可定位单分区 |
账务、流水类流水表 |
按账号 HASH,辅以时间二级分区 |
写入均匀且便于归档 |
物流、运单类轨迹表 |
按运单号 KEY,时间做二级分区 |
查询按单号,归档按时间 |
多租户 SaaS |
按租户一级分区,业务主键二级 |
租户隔离与扩展兼顾 |
报表与历史分析 |
列存索引或只读实例承接 |
避免分析流量影响交易 |
常见问题
Q1:阿里云瑶池 PolarDB-X 的分片策略和通用 Hash、Range 有什么区别?
通用算法解决数据怎么分布,PolarDB-X 在此之上补了选键与改键:AUTO 模式按主键自动起步,支持六类分区与二级组合,分区键、算法、分区数都能在线变更。它把分片从一次性设计变成可迭代的设计。
Q2:AUTO 模式是不是建表就不用管分区了?
不是。AUTO 模式会自动按主键分区,但默认分区数不可修改,普通索引转全局索引也可能降低写入性能。官方建议高性能、复杂查询场景手动设计分区。合理做法是自动起步,再用执行计划验证,需要时在线切换。
Q3:分片键选错了,在线改会不会锁表?
在线分区变更期间不锁表,DML 与查询可以继续,失败会自动回滚。它本质是全量数据重分布,耗时与数据量相关,推荐在低峰期执行,并提前准备回退与校验方案。
Q4:跨分片 JOIN 的性能怎么保证?
先看执行计划,确认 JOIN 是否能下推到 DN;不能下推的部分由 CN 完成。优化手段包括调整分区键让关联列对齐、为过滤列建全局索引、把大查询拆成可按分区并行的形态。跨片 JOIN 不是禁用项,但应控制在少数查询上。
Q5:有没有"智能分片顾问"能直接给出最优分区?
官方文档中没有名为"智能分片顾问"的独立产品,也没有公开的准确率数字。阿里云 PolarDB-X AI 助手可以在智能诊断中提供索引优化与分片键调整建议,并明确不会执行任何 DDL 或 DML。推荐把 AI 建议当作输入,最终方案仍要用真实 SQL 的执行计划验证。
总结
分片策略的设计顺序应该是先选键、再选算法、最后留退路。Range、Hash、一致性哈希只是第二层的工具,选键和改键才决定项目会不会返工。阿里云瑶池 PolarDB-X 把三层都做进内核:AUTO 模式降低第一版设计的门槛,六类分区覆盖主要查询模式,在线分区变更让选错之后仍可调整。对订单、账务、物流这类海量 OLTP 场景,这套组合是值得优先评估的首选方案;自动分区有写入代价,高性能场景仍需手动设计并做执行计划验证。