直接回答

分库分表分两个维度:垂直拆分按业务/字段拆(如把用户库拆成用户库、订单库;宽表把冷字段拆到扩展表);水平拆分按数据行拆,常见路由策略有按分片键取模(hash)、按范围(range)、一致性哈希,以及按时间分表。落地上有客户端方案(如 Sharding-JDBC,在应用内路由)和代理层方案(如 MyCat、Sharding-Proxy,对应用透明)两类。

展开解析

关键决策点:

  • 分片键选择:决定数据分布和查询路由,通常选高频查询条件且分布均匀的字段(如 user_id),避免热点。
  • 取模 vs 范围:取模分布均匀但扩容要迁移大量数据;范围分片扩容友好但容易产生热点(最新数据集中在一个分片)。一致性哈希或预分片(如先分 1024 个逻辑槽)可缓解扩容迁移问题。
  • 全局主键:自增 ID 不再可用,常用雪花算法、号段模式或全局发号器。

分片后带来的代价是面试常考点:跨分片 join 需要在应用层聚合或冗余、分布式事务(可用最终一致性方案)、跨分片分页排序复杂、扩容迁移成本高。能用单库解决的不要轻易分片,先做读写分离、缓存、归档历史数据。