1,什么是分库分表

分库分表是一种将数据拆分到多个数据库或者数九表中的设计策略,主要用于解决随着业务数据量和访问量增长带来的数据库性能问题

通过分库分表,可以减小单个数据库或者单个数据表的访问压力,从而提高查询和写入效率 ,增强系统的并发能力,优化大数据量下的性能表现

实现分库分表

基于业务需求,设计数据分片规则,将数据按照一定的策略,分散到多个数据库或者数据表中去存储,同时开发路由逻辑来决定查询或者写入的错做的目标库表

简单来说就是将数据写入到不同的表中,并且从相同的数据表中读取数据

SharingSphere 分库分表

<!-- 分库分表 -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.2.0</version>
</dependency>

分表策略:静态分表

直接再配置文件中编写分库分表的配置就能完成分库分表

比如

rules:
  sharding:
    tables:
      picture:
        actualDataNodes: ds0.picture_${0..2} # 3张分表:picture_0, picture_1, picture_2
        tableStrategy:
          standard:
            shardingColumn: pictureId       # 按 pictureId 分片
            shardingAlgorithmName: pictureIdMod
    shardingAlgorithms:
      pictureIdMod:
        type: INLINE
        props:
          algorithm-expression: picture_${pictureId % 3} # 分片表达式

在查询表的时候(一般叫逻辑表),框架会自动帮助修改 sssql,根据 id 将查询请求路由到不同的表中

实际上,ShardingSphere 将查询逻辑表的请求自动路由到所有的是积分表,获取到数据之后,在中间层自动合并结果并返回给后端

分表策略:动态分表

就是分表的数量可以根据业务一的实际需求动态的增加,表的结构和队则都是运行的时候动态生成的,

但是动态分表需要自定义实现分表算法类

public class PictureShardingAlgorithm implements StandardShardingAlgorithm<Long> {

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> preciseShardingValue) {
        // 编写分表逻辑,返回实际要查询的表名
        // picture_0 物理表,picture 逻辑表
    }

    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Long> rangeShardingValue) {
        return new ArrayList<>();
    }

    @Override
    public Properties getProps() {
        return null;
    }

    @Override
    public void init(Properties properties) {

    }
}

那么常用的分库分表算法都有哪些呢:

一、哈希取模算法(最常用)

核心:对分片键(如用户ID)做哈希运算后取模,映射到对应库/表,均匀性好、实现简单。

• 普通取模:库/表索引 = 分片键 % 总数量(扩容需重分布数据,易雪崩)

• 一致性哈希:将分片键和节点映射到哈希环,就近匹配,支持平滑扩容,解决普通取模的扩容痛点。

二、范围分片算法

核心:按分片键的数值/时间范围划分库/表,如按用户ID 0-100万存表1、100-200万存表2,或按日期分表(202501、202502)。

• 优点:易扩容、范围查询高效(如查某时间段数据);

• 缺点:易数据倾斜(热点区间数据集中)。

三、列表分片算法

核心:为分片键配置固定的映射关系表,如指定用户ID 1/3/5存库1,2/4/6存库2,或按地区(北京/上海)映射不同库。

• 优点:规则明确、适配业务定制化需求;

• 缺点:需维护映射表,分片键值过多时维护成本高。

四、复合分片算法

核心:组合哈希+范围/列表等多种算法,如先按用户ID范围分库,再按哈希取模分表,兼顾范围查询效率和数据均匀性,适配复杂业务场景。

五、按时间分片算法(范围分片特例,高频单独使用)

核心:专为时间型分片键设计(如订单创建时间、日志时间),按天/周/月/年分表,适配流水类数据(订单、日志、交易记录)。

• 优点:冷热数据易分离(归档历史表)、写入压力分散;

• 缺点:单时间区间易成热点(如大促当天订单表)。

六、取模分片变种:哈希后按段映射

核心:对分片键哈希后,将哈希值按固定区间段映射到库/表(如哈希值0-10000对应表1,10001-20000对应表2),兼顾均匀性,比普通取模更灵活。

各算法核心适用场景
算法 核心适用场景 典型分片键 
哈希取模 无明显热点、需均匀分布数据 用户ID、商品ID 
一致性哈希 需频繁扩容、节点动态增减的场景 分布式集群分片 
范围分片 高频范围查询、数据有明确区间 订单ID、时间戳 
列表分片 业务需定制化映射、分片键值少 地区、商户类型 
时间分片 流水类数据、冷热数据需分离 创建时间、日志时间 
复合分片 复杂业务(既需范围查又需均匀性) 用户ID+订单时间 

补充:分片算法选型核心原则

1. 优先选哈希取模/一致性哈希(无特殊业务要求时),保证数据均匀;

2. 流水类数据必选时间分片,搭配冷热分离策略;

3. 需高频范围查询选范围分片,规避热点需结合哈希二次分片;

4. 定制化业务规则选列表分片,控制映射表规模。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐