面试题:什么是分库分表?分库分表有哪些类型(或策略)?

分库分表的定义

分库分表是一种数据库优化技术,用于解决单库单表性能瓶颈的问题。当数据量过大或并发访问压力过高时,将原本集中存储的数据分散到多个数据库或多个表中,从而提升数据库的性能、扩展性和可用性。

  • 典型场景:电商订单表、社交平台用户信息表等海量数据业务。
  • 核心目标
    • 降低单库/表的数据量(减少磁盘IO和内存压力)。
    • 提高查询和写入效率(并行处理)。
    • 支持水平扩展(动态增加数据库或表)。

分库分表的类型(策略)

1. 按拆分维度分类

(1)垂直分库
  • 定义:按业务模块将不同表分散到不同数据库中。
    • 示例:电商系统中,将用户模块(用户表、地址表)拆到“用户库”,订单模块(订单表、支付表)拆到“订单库”。
  • 优势
    • 物理隔离业务模块,减少跨库依赖。
    • 突破单机硬件限制(如磁盘容量、连接数)。
  • 适用场景
    • 表之间关联性低,但数据量大的场景(如用户中心与订单中心分离)。
(2)垂直分表
  • 定义:按字段(列)将一张表拆分为多个子表,通常根据字段的访问频次或属性。
    • 示例:订单表中,高频访问的字段(订单号、价格)存入“订单基础表”,低频字段(物流备注)存入“订单扩展表”。
  • 优势
    • 减少单表字段宽度,提升热点数据访问效率。
    • 优化数据库行加载性能(减少磁盘IO)。
  • 不足
    • 需要多表关联查询,增加SQL复杂度。
  • 适用场景
    • 表字段多且冷热数据差异大的场景(如用户信息表包含冗余字段)。
(3)水平分库
  • 定义:将同一张表的数据分散到多个数据库实例中(物理隔离)。
    • 示例:订单表按用户ID取模,分散到 db_0db_1 两个数据库。
  • 优势
    • 突破单库硬件限制(如连接数、磁盘容量)。
    • 支持高并发写入(负载均衡到多个库)。
  • 适用场景
    • 单表数据量极大且需要横向扩展的场景(如社交平台的消息记录)。
(4)水平分表
  • 定义:将同一张表的数据按规则拆分成多个表(逻辑上是同一张表)。
    • 示例:订单表按用户ID取模拆分为 order_0order_1 四个表。
  • 优势
    • 降低单表数据量,提升查询性能(减少全表扫描)。
    • 支持灵活的分片策略(如时间分表、哈希分表)。
  • 适用场景
    • 单表数据量超过千万级的场景(如日志系统、交易记录)。

2. 按组合策略分类

(1)垂直+水平分库分表
  • 定义:先按业务模块垂直分库,再在每个库内按规则水平分表。
    • 示例
      • 垂直分库:用户库、订单库、商品库。
      • 水平分表:订单库中按用户ID分表(order_0order_1)。
  • 优势
    • 兼顾业务隔离和数据分散的灵活性。
  • 适用场景
    • 复杂业务系统(如电商平台需同时处理用户、订单、商品)。
(2)混合分库分表
  • 定义:结合垂直分表和水平分库/分表策略。
    • 示例
      • 垂直分表:用户表拆分为 user_base(基础信息)和 user_detail(详细信息)。
      • 水平分库:user_base 按地域分库(华北库、华东库)。

分库分表的常见策略

策略类型分片规则优点缺点
哈希分片按分片键哈希值分配(如 user_id % N数据分布均匀,路由简单扩容时需迁移数据
范围分片按分片键范围划分(如时间范围、ID区间)扩容方便,支持范围查询数据分布可能不均(如热点问题)
一致性哈希使用一致性哈希算法扩容时数据迁移少实现复杂
时间分片按时间单位(年/月/日)分表适合日志类数据归档历史数据查询需跨表
列表分片按枚举值划分(如城市、业务类型)业务逻辑清晰分片键固定,扩展性差

分库分表的核心问题

  1. 数据一致性:跨库事务需分布式事务框架(如 Seata、TCC)。
  2. 分片键设计:选择高频查询字段,避免数据倾斜。
  3. 扩容迁移:需双写策略或增量同步工具(如 Canal)。
  4. 跨分片查询:避免跨库JOIN,或使用中间件(如 ShardingSphere)。
  5. 运维复杂度:需监控分片负载、数据分布及故障恢复。

总结

  • 分库分表是应对大数据量和高并发的核心手段,需根据业务特点选择策略(如垂直/水平分库分表)。
  • 关键点:合理设计分片键、平衡读写性能、处理分布式事务、规划扩容方案。
  • 工具支持:可借助中间件(如 ShardingSphere、MyCAT)简化开发和运维。
THE END
喜欢就支持一下吧
点赞15 分享