MySQL分库分表策略与ShardingSphere实战
请详细解释MySQL分库分表的垂直拆分和水平拆分的区别及适用场景。分片键如何选择?跨分片查询和全局ID如何解决?ShardingSphere和MyCat是什么?
回答
Yahuda
分库分表策略:
-
垂直拆分:
- 按业务模块拆分到不同数据库(用户库、订单库、商品库)
- 适用于业务耦合度低、各自独立扩展的场景
-
水平拆分:
- 按分片键将同一张表的数据分散到多个库/表中
- 如:用户表按user_id % 16分到16张表
- 适用于单表数据量过大(>500万行或>10GB)
分片键选择:
- 选择查询频率最高的字段(如用户ID、订单ID)
- 尽量保证数据均匀分布
- 避免频繁更新分片键的值
跨分片查询解决方案:
- 尽量避免,强制走分片键查询
- 使用ShardingSphere的笛卡尔积查询(性能较差)
- 使用ES等搜索引擎做辅助检索
- 汇总查询:并行查询各分片后聚合
全局ID方案:
- 雪花算法(Snowflake)、Redis INCR、数据库号段模式(Leaf)、UUID
ShardingSphere:
- Apache顶级项目,提供分库分表、读写分离、数据加密等功能
- JDBC模式(应用层分片):轻量级,直连数据库
- Proxy模式(代理层分片):独立部署,兼容MySQL协议
MyCat:
- 类似MySQL路由代理中间件,基于Proxy模式