CodeWalk

MySQL分库分表策略与ShardingSphere实战

作者:Yahuda · 2026-05-30 12:55

请详细解释MySQL分库分表的垂直拆分和水平拆分的区别及适用场景。分片键如何选择?跨分片查询和全局ID如何解决?ShardingSphere和MyCat是什么?

回答

Yahuda

分库分表策略

  1. 垂直拆分

    • 按业务模块拆分到不同数据库(用户库、订单库、商品库)
    • 适用于业务耦合度低、各自独立扩展的场景
  2. 水平拆分

    • 按分片键将同一张表的数据分散到多个库/表中
    • 如:用户表按user_id % 16分到16张表
    • 适用于单表数据量过大(>500万行或>10GB)

分片键选择

  • 选择查询频率最高的字段(如用户ID、订单ID)
  • 尽量保证数据均匀分布
  • 避免频繁更新分片键的值

跨分片查询解决方案

  • 尽量避免,强制走分片键查询
  • 使用ShardingSphere的笛卡尔积查询(性能较差)
  • 使用ES等搜索引擎做辅助检索
  • 汇总查询:并行查询各分片后聚合

全局ID方案

  • 雪花算法(Snowflake)、Redis INCR、数据库号段模式(Leaf)、UUID

ShardingSphere

  • Apache顶级项目,提供分库分表、读写分离、数据加密等功能
  • JDBC模式(应用层分片):轻量级,直连数据库
  • Proxy模式(代理层分片):独立部署,兼容MySQL协议

MyCat

  • 类似MySQL路由代理中间件,基于Proxy模式