MySQL分库分表
何时需要分库分表
分库分表通常在以下场景中需要考虑:
- 数据量过大:单表数据量超过千万级别,查询性能明显下降,索引效率降低。
- 并发压力高:数据库连接数不足,频繁出现锁竞争或资源争用。
- 业务解耦:不同业务模块需要独立维护数据,避免相互影响。
- IO瓶颈(磁盘IO,网络IO)、CPU瓶颈(聚合查询,连接数太多)
分库:我本来一个数据库,我拆成多个数据库进行存储
分表:我本来一张表的数据,拆成多个表进行存储
垂直拆分
垂直分库
拆分成不同库里面存储不同业务数据。用的比较多,微服务常用
垂直分表
把字段包含数据多的、不常用的分开。分表并不一定是在多个库,也可以在一个库里
比如:一些很长的数据,比如商品描述,文章等
水平拆分
水平分库
每个库存放的数据都不一样,应用根据路由规则去查询。
- 按业务分库:例如订单库、用户库分离。
- 按数据分片:如将订单库按地域拆分为
orders_db_east
、orders_db_west
。
水平分表
也是根据路由规则去查询数据
分库分表中间件
常用工具简化路由逻辑:
- ShardingSphere:Apache开源的分布式数据库生态。
- MyCat:基于Proxy的分库分表方案。
ShardingSphere配置示例(YAML)
注意事项
- 分布式事务:跨库操作需引入Seata等事务框架。
- 跨分片查询:避免JOIN,改用冗余字段或业务层聚合。
- ID生成:使用雪花算法(Snowflake)替代自增ID。
- 扩容难度:预先设计好分片键的扩展性。