▌ 技术引导
我干过一个千亿级数据量的项目,当时数据库性能濒临崩溃,必须得做分库分表,但不是随便分。我直接砍了分片策略,把业务逻辑和读写分离拆开,用ShardingSphere-JDBC做本地分片,配合逻辑主键生成策略和数据迁移脚本。分库分表不是为了分,而是为了不让分片键选错,导致数据倾斜和查询性能下降。千万别用自增ID做分片键,尤其是在分布式场景下,会导致热点问题,我见过太多项目因为这个死机。如果你的数据是读多写少,分库分表要配合缓存和异步写入,否则命中率低的查询会拖垮整个系统。我见过用一致性哈希分片的,但分片数太少,导致查询必须全表扫描,性能差得离谱。分库分表要提前设计好路由逻辑,不能等上线后才玩。
▌ 技术参考
一
技术背景与核心概念
分库分表是解决单机数据库性能瓶颈的常见手段,但必须理解分片键的选择对查询效率的影响。2024年以前,很多团队用简单的ID模运算分片,结果分片数少,数据分布不均,写入时热点明显。我见过一个电商项目,日均请求量超过千万,用订单ID模4分片,但写入压力集中在某个分片,最终导致主库崩溃。分片策略要根据业务场景决定,比如订单系统用订单号,用户系统用用户ID,而日志系统可能用时间戳。ShardingSphere-JDBC是2025年之后主流选择,相比ShardingSphere-Proxy更轻量,但需要应用层配合,配置项一般在application.yml里,比如shardingRule下的表分片策略。
二
具体操作方法或配置步骤
分库分表第一步是确定分片键,这个过程得用实际数据分布做测试。我用的是ShardingSphere-JDBC,配置分片策略时,要定义分片算法,比如使用标准分片算法或者自定义哈希算法。在分片算法里,需要指定分片列和分片值,比如分片列是user_id,分片值是整数,那么配置类似:
```yaml
spring:
shardingsphere:
rules:
sharding:
tables:
user:
actual-data-nodes: user_${0..1}
database-strategy:
standard:
sharding-column: user_id
sharding-algorithm-name: user-inline-sharding-algorithm
table-strategy:
standard:
sharding-column: user_id
sharding-algorithm-name: user-inline-sharding-algorithm
sharding-algorithms:
user-inline-sharding-algorithm:
type: STANDARD
props:
algorithm-expression: user_${user_id % 2}
```
这个配置是2025年主流做法,分库分表策略要绑定到业务逻辑,避免分片键冲突。
三
常见踩坑场景与避坑方案
我遇到过分片策略配置错误导致数据找不到的问题,特别是在分片键是字符串时,需要确保算法支持字符串类型。另外,分库分表后,主键策略必须调整,不能用自增ID,否则可能产生重复。我见过一个项目,用户主键用了自增,分片后出现跨分片的重复主键冲突,导致程序异常。解决方法是用雪花算法或UUID生成主键,或者用逻辑主键。分片算法必须和业务数据量对齐,比如某个业务日均处理量是100万,那分片数不能低于10,否则每个分片写入量太大,影响性能。
四
性能影响或效率对比
分库分表后,写入性能有明显提升,但查询性能取决于分片键是否匹配。我对比过两个方案,一个是分片数3,一个是分片数20,前者写入快,但查询需要扫全表,后者写入慢,但查询效率高。2025年,很多公司用分片数20-40来平衡负载,这样查询命中率在75%以上。但分片数太多,维护成本会翻倍,特别是在数据迁移和扩容时。我用的是ShardingSphere-JDBC,发现它对慢查询的处理不如Proxy,但对复杂查询优化得更好,特别是结合MySQL的分区表和索引策略。
五
适用场景与局限性
分库分表适合数据量大、读写都高的业务场景,比如订单系统、用户系统。但不适合写多读少的场景,比如日志系统,容易产生数据倾斜。2024-2026年,分库分表的常见问题是分片策略不够灵活,尤其是业务扩展后,分片数不够,需要频繁扩容。我见过一个项目,分片数设置为50,结果业务增长到百万级,导致查询口径变复杂,需要重新做分片。另外,分库分表后,事务管理变得复杂,跨分片事务只能用全局事务解决方案,比如Seata,但对性能有一定影响。
六
替代方案或进阶技巧
如果分库分表太麻烦,可以考虑用垂直分库,把不同业务模块拆到不同库,比如订单库、用户库、支付库。垂直分库在2025年被很多中型项目采用,因为维护简单,而且对查询性能提升明显。不过垂直分库无法解决水平扩展的问题,如果数据量继续增长,还是得做分表。另一个替代方案是使用分布式数据库,比如TiDB,它自带分库分表能力,适合需要高并发和强一致性场景。我见过一个项目用TiDB替代传统分库分表方案,结果运维成本反而更低,因为不需要手动处理分片迁移和数据同步。
七
技术背景与核心概念
分库分表的路由策略分为标准分片、哈希分片、范围分片等,每种策略都有适用场景。标准分片适合有明显业务分层的表,比如用户表按地区分,订单表按年月分。哈希分片适合不关心分片分布的业务,比如用户ID哈希分片。但哈希分片的问题在于查询效率差,特别是当查询条件不是分片键时,必须全表扫描。我见过一个金融科技项目,用用户ID哈希分片,但经常需要查询用户关联信息,导致性能瓶颈。在2025年,很多团队开始用复合分片策略,比如用户ID+时间范围,这样既能保证数据分布,又能提高查询命中率。
八
具体操作方法或配置步骤
配置分片策略时,要确保分片算法和分片键匹配。比如,数据库分片用用户ID,那么在分片算法里必须指定用户ID作为分片列。如果分片算法是哈希分片,那么需要定义模运算参数,比如分片数是50,那么分片表达式是user_id % 50。我见过一个项目用到了自定义分片算法,比如根据用户等级来分库,配置起来比标准分片复杂,但业务命中率更高。在分片策略里,还可以配置分片绑定,比如数据库分片和表分片绑定,这样查询时能直接定位到具体分片。这在2026年已经被广泛应用,特别是在复杂业务场景下。
九
常见踩坑场景与避坑方案
分片策略配置错误会导致数据找不到,比如分片键和分片算法不匹配,或者分片数设置错误。我在2025年处理过一个项目,分片算法用了user_id % 2,但实际分片数是3,导致数据分布不均。解决方法是重新计算分片数,或者用更灵活的分片算法。另外,分片键的选择会影响查询效率,如果分片键是主键,那么查询效率最高,但如果分片键是其他字段,比如订单号,查询效率会下降。我见过一个项目用订单号作为分片键,但经常需要按用户ID查询,导致效率低下。优化方法是重新选分片键,或者在查询时加上分片键过滤条件。
十
性能影响或效率对比
分库分表后,写入性能提升明显,但查询性能需要看是否命中分片。比如,如果查询条件是分片键,那么命中率接近100%,否则可能需要全表扫描。我在2025年测试过两种分片策略,一个是标准分片,一个是范围分片,结果范围分片在时间范围查询上表现更好,因为分片数据是有序的。但标准分片在业务分层查询上更灵活。分片数越少,写入压力越集中,但查询效率越高;分片数越多,查询效率越分散,但写入压力越低。我见过一个项目分片数设为100,结果写入延迟增加300ms,查询命中率下降到50%。
十一
适用场景与局限性
分库分表适合数据量大、查询分布明确的场景,比如用户系统、订单系统。但如果业务查询随机性强,或者分片键不固定,分库分表反而会增加复杂度。2026年,很多团队开始用动态分片,根据查询条件自动选择分片,但实现起来比较复杂。比如在电商平台,订单表按用户ID分片,但有时需要根据时间范围查询,这时候需要结合范围分片策略。分片策略要和业务强绑定,不能随便改,否则会导致数据迁移困难。
十二
替代方案或进阶技巧
如果分库分表太复杂,可以考虑使用NoSQL数据库,比如MongoDB或Elasticsearch,它们天生支持分片,而且查询效率更高。但NoSQL的事务支持不如MySQL,所以只适合特定场景。我见过一个项目用MongoDB替代MySQL,分库分表策略自动处理,但后来因为业务需要关系型数据,又回到MySQL。另一个替代方案是使用中间件,比如MyCat,它能在应用层处理分库分表,但需要额外维护。2024-2026年,中间件方案逐渐被ShardingSphere-JDBC取代,因为JDBC方案更轻,更灵活。
十三
技术背景与核心概念
分库分表不仅仅是技术问题,更是架构设计问题。2024年以后,很多公司开始用数据库中间件来简化分片逻辑,但中间件本身的性能和稳定性需要严格测试。分库分表之后,数据备份和恢复也会变得复杂,比如需要同时备份多个分片,或者在恢复时同步数据。我见过一个项目,分库分表后数据备份失败,导致整个系统停摆。分库分表的另一个关键点是分片数的动态调整,不能一成不变,要根据业务增长情况随时扩展。
十四
具体操作方法或配置步骤
动态调整分片数可以通过ShardingSphere-JDBC的配置变更功能,比如在application.yml里修改分片算法参数。不过真正动态调整需要重启服务,所以在2025年,很多团队用ETCD做配置中心,实现热更新分片策略。具体命令是使用`shardingSphereConfig`命令修改分片数,但需要确保应用层能感知到变化。分片数调整的时候,要避免分片键冲突,比如分片数从100变成200,原来的分片键可能映射到新分片,导致数据找不到。这种问题在2026年的实际部署中容易出现,必须提前规划好分片策略的扩展性。
十五
常见踩坑场景与避坑方案
分库分表后,业务逻辑必须调整,比如原来的单库SQL现在需要改成分库查询。我见过一个项目因为SQL没改,导致分片查询失败,系统崩溃。分片后的事务处理也容易出问题,比如跨分片事务必须用全局事务管理器,否则可能出现数据不一致。2025年,很多团队用Seata做分布式事务,但需要额外支付费用。另外,分片后的数据迁移需要谨慎,迁移脚本必须校验分片键和分片数是否一致,否则会漏数据。我见过一个项目因为数据迁移脚本错误,导致部分数据丢失,修复成本很高。
数据库分库分表策略 | 技术负责人 灰度发布
我干过一个千亿级数据量的项目,当时数据库性能濒临崩溃,必须得做分库分表,但不是随便分。我直接砍了分片策略,把业务逻辑和读写分离拆开,用ShardingSphere-JDBC做本地分片,配合逻辑主键生成策略和数据迁移脚本。分库分表不是为了分,而是为了不让分片键选错,导致数据倾斜和查询性能下降。千万别用自增ID做分片键,尤其是在分布式场景下,
系统架构AI1 次阅读
Related
延伸阅读

4个MongoDB索引SQL调优,性能提升10倍数据库 · 2026-07-14

建议收藏:VS Code Cursor 性能优化 | 老用户总结VS Code指南 · 2026-07-10

VS Code Copilot性能优化:4个快捷键速查 | 2026最新版VS Code指南 · 2026-07-13

保姆级教程 | PostgreSQL优化:性能优化实战数据库 · 2026-07-10

Codex多文件编辑怎么用:7个方法Codex智能 · 2026-07-10

纯干货 | Angular Signals的17种样式方案前端工程 · 2026-07-14