MySQL 开始分库分表时,别急着换国产数据库:先问完这五句

国产数据库不是一张替代清单。MySQL 扛不住之后,先弄清它解决什么、你要付什么账,才知道这次该不该换。

一个 MySQL 集群开始不好伺候,团队通常会经历同一串动作:加只读副本、拆热点表、按用户 ID 分库、路由写进中间件、跨库查询单独做服务。

最开始都觉得还能扛。

直到某次需求只是“查一下用户在所有店铺的订单”,代码评审里先出现的不是 SQL,而是“这个表到底落在哪个库”“能不能接受异步汇总”“跨库事务谁兜底”。这时候,“换国产数据库”会突然变成一个很有诱惑力的选项。

但它不是止痛药。

国产数据库不是让 MySQL 原地变强;它是在替你接走一部分扩展、可用性和兼容性问题,同时把另一部分复杂度交还给你。

这篇不列厂商,也不讲谁排第几。只把一个只用过 MySQL 的开发者最该问的五句话讲清楚:它是什么,能干什么,你为什么可能需要它,代价落在哪里,最后又到底能换回什么。

【配图占位 1】单库 → 应用层分片 → 多节点数据层。突出“复杂度没有消失,只是换了落点”。详见配图 brief。

1. 这是啥

一句话:国产数据库是一组由本土厂商交付的关系数据库产品;对应用来说仍然是表、SQL、索引和事务,对团队来说换的是兼容边界、扩展方式和运维模型。

别把“国产”理解成一种新的数据库原理。

你不会因为换了它,就突然不用写索引、不用看慢查询、不用处理死锁。业务代码照样要连数据库,ORM 照样会生成 SQL,线上照样会有大事务和误删风险。它首先是一个产品与交付选择,不是一种脱离关系数据库常识的新技术。

真正容易误解的是后半句。

MySQL 用久了,很多人默认的世界观是:一份数据主要待在一台主库上;容量不够,先加机器;读不够,拉副本;再不够,就由应用决定数据去哪张表、哪个库。

而你考虑换的这类产品,常常会把“数据能不能放到多台机器上”“一台机器故障后谁接手”“应用看到的还是不是一张表”这些事,往数据库内部收一部分。

这不代表它替你做完了架构。

它只是把原来散在路由层、同步任务、脚本和人工操作里的规则,换成了数据库自己的规则。规则放的位置变了,责任没有消失。

2. 干什么的

和单机 MySQL 相比,开发者真正能感知到的变化,通常不是某个宣传名词,而是下面几件很具体的事。

数据可以跨机器放。

以前一张大表顶到单机磁盘、CPU 或写入上限,你的动作往往是拆库拆表。拆完以后,orders_17orders_18 在应用眼里已经不是一张表了:路由要算,聚合要补,运维要记住每个库的容量。

有些数据库可以把一张逻辑表拆成多个数据分区,放到不同机器上。应用仍然面对一张表,数据到底在哪台机器,由系统按规则处理。你少写了一层分片路由,至少不用每次业务查询都先问“落点在哪”。

事务可能跨节点。

分库之后,最难受的不一定是查询,而是本来一句 BEGIN 能解决的事情,忽然要面对多个库。你可以改成最终一致,也可以上补偿和对账;这都是工程方案,但每种都要把失败路径补齐。

支持跨节点事务的数据库,能让一部分原本跨库的写入仍在数据库事务语义里完成。这里的关键词是“一部分”。数据一旦不在同一个节点,协调、网络往返和副本确认都会进账单。它能让你少造轮子,不会让物理成本归零。

高可用的动作更靠近数据库。

单主、主从、故障切换、读写漂移,这些词 MySQL 团队都不陌生。差别在于,有些产品会把副本、故障检测、切换和数据重建做得更内聚。应用不必为每一个节点故障临时拼一套流程。

但“更内聚”不等于“你不用管”。副本放在哪个故障域、切换时能丢多少数据、连接池多久感知、下游能不能承受短暂失败,仍然是你的系统问题。

扩容不再总是一次业务改造。

分库分表最贵的部分,往往不是第一次拆,而是第二次、第三次扩容。库数量从 16 变成 32 时,路由规则、历史数据、离线任务、报表口径都可能要动。

如果数据库能把数据分布与重平衡接住,扩容会更像一次受控的基础设施操作,而不是让业务团队改一轮代码。注意,是“更像”,不是“点一下按钮就结束”。热点、容量、水位和迁移窗口还是要盯。

这些能力可以压成一句:它想把你已经塞进应用层的数据分布问题,往数据库里收回去。

3. 我为什么要用它

不是因为“分布式听起来更高级”,更不是因为某个采购词。

你该考虑它,通常是因为 MySQL 的使用方式已经开始反过来塑造业务代码,而且这种塑造越来越贵。

有三个信号,缺一个都不够。

单库真的撑不住了。

这里说的不是“表有点大”或者“慢查询偶尔报警”。先把索引、SQL、归档、冷热分离、连接池、读写模型这些基础账算完。如果这些都没做,直接换库,多半是在用更复杂的系统掩盖旧问题。

真正值得抬头看新方案的情况是:数据和写入还在持续长,单机的容量或吞吐已经成了明确边界;而且你不是只想把机器再加大一档,而是需要一种能随着节点增加继续承接数据的方式。

分库分表已经把业务代码磨坏了。

这不是“项目里有 Sharding 中间件”就算。

是每做一个需求,开发者都得先问分片键;跨分片查询要改成异步任务;分页、排序、聚合在多个库之间变得别扭;全局唯一 ID、跨库事务、数据回灌和扩容迁移各自长出一套约定。最危险的是,这些约定不会集中在一个地方,而是渗进订单、账户、营销、报表的每一层。

如果你的团队已经花大量时间维护这些边界,数据库把部分分布规则收回去,可能比继续堆中间件更划算。

你想替换,但真正害怕的是被锁死。

很多替换讨论一上来就只问:“兼不兼容 MySQL?”

这个问题不够。兼容协议,和你的应用能平移,是两回事。驱动能连上,只说明第一关过了。函数、排序规则、时间语义、事务隔离、存储过程、触发器、DDL 行为、备份链路、监控脚本,后面每一关都可能留下坑。

所以“怕被锁定”不能靠承诺解决,只能靠验收解决:把现网 SQL、存储过程、关键报表、故障切换和备份恢复拉进 PoC。你能跑通、能解释、能回滚的兼容,才叫兼容。

这三件事同时出现时,才值得认真评估换库:

  • 单机边界已经是现实,不是想象;
  • 应用层分片复杂度已经持续吞人;
  • 团队愿意为 PoC、压测和运维能力投入时间。

少一条,都别把换数据库当成默认答案。

【配图占位 2】三盏“该不该换”的信号灯:单机边界、应用层分片成本、团队治理能力。详见配图 brief。

4. 有什么负担

换过去以后,最容易失望的原因,是团队以为自己买到了“没有分库分表”,实际上买到的是“分库分表不再只写在业务代码里”。

账还在,只是换了收款方。

开发习惯要改。

以前你写 SQL,默认假设数据都在本机、事务都在本地、扫描范围可控。换到多节点环境后,要开始对分区键、热点值、跨节点访问敏感。

一条没有带分区条件的查询,单库里可能只是慢一点;在多节点环境里,它可能变成扫更多数据、走更多网络,最后把延迟和资源账一起拉高。业务里特别集中的租户、商家、用户或时间段,也可能让“横向扩展”变成少数节点很忙、其他节点很闲。

这不是让每个开发者都去当 DBA,而是 SQL 评审里要多一条判断:它会不会把数据分布规律打穿。

SQL 不能只看能不能执行。

最危险的迁移进度条是:应用启动成功了。

生产系统依赖的不只有 SELECTINSERT。一段历史遗留的存储过程,一个依赖特定排序规则的查询,一次线上 ALTER TABLE,一个备份恢复脚本,都可能在新系统里有不同语义或不同代价。

特别是 online DDL。单库里你已经形成了某种“这个变更大概多久、会不会挡写入”的直觉。换库后,这个直觉必须作废重建。数据分布、复制、重平衡和元数据操作都会改变 DDL 的成本曲线。没有在接近生产的数据量上演练过,就不要给业务承诺窗口。

事务行为会多一层成本。

跨节点事务不是魔法。它能帮你保住一部分一致性,也会引入协调路径。高频、短小、跨节点的写入,往往比单节点事务更贵。

更现实的做法不是“既然支持,就放心跨”。而是把数据模型和写入路径设计成:大多数高频事务尽量局部完成;真正必须跨节点的少数路径,单独压测、监控和限流。

别因为数据库提供了能力,就把它当成默认写法。

运维不会消失,只是从主从切换,变成了更长的清单。

你会开始关心节点是否均衡、某个分区是否过热、扩容后数据有没有迁完、副本是否跨了故障域、容量余量是否够重平衡、故障时应用连接会怎样抖。

托管服务能替你做掉一部分机器活,但不能替你定义这些阈值,更不能替你判断业务是否能承受一次切换。

所以要把一句话说透:分布规则由数据库接管,不等于分布式系统由数据库替你负责。

5. 有什么收益

收益当然有,不然没人会折腾。

最直接的收益,是让应用重新把注意力放回业务,而不是长期维护数据路由的旁枝末节。

当一张逻辑表可以在多个节点上承接数据,当扩容不必同步改一轮路由规则,当部分跨库写入不必立刻拆成补偿事务,你会发现很多代码终于不需要为了“数据在哪”而存在。新需求的讨论能回到数据模型和业务规则,而不是先开一场分片键会议。

还有一个收益,是容量和可用性的操作空间变大。

单机体系到了边界,选择通常很硬:升级机器、继续拆,或者接受瓶颈。能够横向承接数据的系统,给了你多一条路。某台机器出问题时,副本与切换机制也能让故障处理更标准化,而不是每次靠人肉救火。

但这些收益有明确前提。

如果你的数据量和写入还在单机的舒适区,MySQL 的成熟生态、低心智负担和团队熟悉度,本身就是收益。为了一个未来也许会出现的瓶颈,提前引入多节点复杂度,通常不划算。

如果你的分库分表只是两三张边缘表,且团队已经把路由、迁移和查询边界控制得很稳,替换也未必值得。重写、回归、双写、演练和新的运维体系都要花钱;“少一点不舒服”换不回这笔成本。

真正能吃到收益的,是这类团队:增长边界已经清楚;应用层分片已经成了长期税;团队愿意把分区、热点、事务路径和故障演练当成日常工程,而不是上线前的临时作业。

最后给一个比“选哪个”更实用的动作。开 PoC 前,先让参与的人分别写下这五个答案:

  1. 我们今天的瓶颈,究竟是单机容量、写入,还是 SQL 和索引没做好?
  2. 如果继续分库分表,未来一年最贵的三件事是什么?
  3. 哪些高频写入可以保证局部完成,哪些真的必须跨节点?
  4. 现网有哪些 SQL、DDL、脚本和工具必须逐条验收?
  5. 故障、扩容、回滚发生在晚上两点时,谁有能力把它处理完?

如果这五句写不出来,先别选产品。

数据库选型真正要买的,从来不是一个更响的名字,而是一种你们团队能长期承担的复杂度。

【配图占位 3】收益与边界的天平:少写路由、横向承接、可用性标准化,对应热点、跨节点事务、SQL 回归和运维能力。详见配图 brief。