首页 > 其他分享 >分库分表

分库分表

时间:2024-12-17 11:11:43浏览次数:9  
标签:分库 int userId user 分表 id

分库分表是为了应对海量数据或高并发场景的一种数据库架构优化技术,其核心思想是通过水平和垂直切分的方式,将数据分散到多个库或表中,提升系统的读写性能和扩展性。 以下是分库分表的相关概念、策略和实现细节:


分库分表的两种主要策略

  1. 水平分片(Sharding)
    1. 特点:将同一张表的数据按某种规则拆分到多个库或表中。
    2. 适用场景:单表数据量过大,查询效率降低。
    3. 实现方式
      • 按字段取模(如:user_id % N)。
      • 按范围(如:1-100万用户放入库1,100万-200万放入库2)。
      • 按哈希分布。
  2. 垂直拆分(Vertical Partitioning)
    1. 特点:按照业务模块将不同的表分布到不同的库中。
    2. 适用场景:数据库中表过多或存在跨业务查询。
    3. 实现方式
      • 不同的业务模块(如用户、订单)分配到不同的数据库。

分库分表的核心问题及解决方案

  1. 路由问题
    1. 问题:如何根据分库分表规则定位具体的库或表。
    2. 解决方案:
      • 自定义路由规则(如基于 user_id 的哈希算法)。
      • 使用中间件(如 ShardingSphere、MyCAT)来自动路由。
  2. 事务问题
    1. 问题:分布式事务在多库间的操作会非常复杂。
    2. 解决方案:
      • 两阶段提交(2PC):通过事务协调器保证分布式事务。
      • TCC 模式(Try-Confirm-Cancel):需要业务逻辑支持。
      • BASE 理论:允许弱一致性,最终达到一致性。
  3. 跨库/跨表查询问题
    1. 问题:分库分表后,涉及多个库或表的数据查询会变得复杂。
    2. 解决方案:
      • 聚合查询:通过代码逻辑在应用层进行数据整合。
      • 中间件支持:如 ShardingSphere 提供 SQL 聚合查询功能。
  4. 主键冲突问题
    1. 问题:分库分表后,各表可能会产生主键冲突。
    2. 解决方案:
      • 全局唯一 ID:使用分布式 ID 生成器(如 Snowflake 算法)。
      • 字段前缀:通过库/表编号给主键加前缀。

常见中间件解决方案

  1. ShardingSphere
      1. 特点:支持分库分表、读写分离、分布式事务。
      2. 使用方式:基于 Spring Boot 直接配置。
      3. 示例配置:
    spring:
      shardingsphere:
        datasource:
          names: ds0, ds1
          ds0:
            url: jdbc:mysql://localhost:3306/db0
            username: root
            password: root
          ds1:
            url: jdbc:mysql://localhost:3306/db1
            username: root
            password: root
        sharding:
          tables:
            user:
              actual-data-nodes: ds${0..1}.user_${0..1}
              table-strategy:
                inline:
                  sharding-column: user_id
                  algorithm-expression: user_${user_id % 2}
              database-strategy:
                inline:
                  sharding-column: user_id
                  algorithm-expression: ds${user_id % 2}

     

  2. MyCAT
    1. 特点:基于代理模式,支持分库分表和读写分离。
    2. 缺点:需要额外维护 MyCAT 服务器。
  3. Vitess
    1. 特点:由 YouTube 开发,支持 MySQL 的分库分表。
  4. TDDL
    1. 特点:阿里巴巴的分库分表框架。

分库分表的实现示例

以用户表为例,将用户数据按 user_id % 2 分到两个库,每个库中包含两张表。

数据库结构

  • 库1db1,包含表 user_0user_1
  • 库2db2,包含表 user_0user_1

自定义分库分表代码

public class ShardingRouter {
    private static final int DATABASE_COUNT = 2; // 数据库数量
    private static final int TABLE_COUNT = 2;    // 每个库中的表数量
    /**
     * 根据 userId 获取数据库名称
     */
    public static String getDatabaseName(int userId) {
        int dbIndex = userId % DATABASE_COUNT;
        return "db" + (dbIndex + 1); // 数据库命名:db1, db2
    }
    /**
     * 根据 userId 获取表名称
     */
    public static String getTableName(int userId) {
        int tableIndex = userId % TABLE_COUNT;
        return "user_" + tableIndex; // 表命名:user_0, user_1
    }
    public static void main(String[] args) {
        int userId = 12345;
        String dbName = getDatabaseName(userId);
        String tableName = getTableName(userId);
        System.out.println("数据库:" + dbName + ",表:" + tableName);
    }
}

 


分库分表适用场景

  • 大型电商平台:订单、用户、商品等海量数据的存储与查询。
  • 物流系统:包裹信息存储。
  • 银行业务:交易流水数据。

标签:分库,int,userId,user,分表,id
From: https://www.cnblogs.com/wjwjs/p/18611889

相关文章

  • 什么是分库分表?分库分表有哪些类型(或策略)?
    什么是分库分表?分库分表是一种常用的数据库架构设计策略,用于处理数据量过大,单一数据库无法承载的情况。通过将数据分散存储到多个数据库或多个数据表中,分库分表能够有效提高数据库的扩展性、性能和可维护性。其主要目的是提升查询效率,减轻单个数据库的负载,确保系统的高可用性和高......
  • 对数据库进行分库分表可能会引发哪些问题?
    对数据库进行分库分表可能会引发的问题虽然分库分表是一种有效的扩展数据库和提升性能的策略,但在实际应用中,分库分表也可能引发一些问题和挑战。以下是分库分表可能会引发的主要问题:1.跨库查询复杂性分库分表后,数据被拆分到多个数据库和表中,导致跨库查询变得非常复杂:多表连......
  • 蓝易云 - sharding-jdbc分库连接数优化教程
    在使用Sharding-JDBC进行分库分表时,优化连接数是一个重要的考虑因素。下面是一个关于如何优化Sharding-JDBC分库连接数的简单教程。配置连接池参数:在Sharding-JDBC的数据源配置中,我们可以设置连接池相关的参数来优化连接数。以下是一些常见的连接池参数:minPoolSize:连接池中......
  • 分库分表—4.数据迁移系统文档d3
    大纲1.数据库设计2.枚举类3.接⼝设计4.定时任务设计(1)定时核对校验数据的定时任务(2)数据量统计定时任务(3)增量数据落地定时任务(4)失败重试定时任务5.技术亮点(1)滚动拉取方案(2)巧妙的统计滚动进度方案(3)防止增量同步数据丢失和高效写入方案(4)数据扩容方案6.......
  • 分库分表—4.数据迁移系统文档
    大纲1.数据库设计2.枚举类3.接⼝设计4.定时任务设计(1)定时核对校验数据的定时任务(2)数据量统计定时任务(3)增量数据落地定时任务(4)失败重试定时任务5.技术亮点(1)滚动拉取方案(2)巧妙的统计滚动进度方案(3)防止增量同步数据丢失和高效写入方案(4)数据扩容方案6.......
  • 分库分表—3.详细介绍二
    大纲18.基于Canal和RocketMQ的增量同步19.增量同步任务的背景介绍20.增量同步任务查询与线程池提交21.RocketMQ里的binlog消息的消费逻辑分析22.新增binlog的数据同步逻辑分析23.binlog基于内存队列的异步转发逻辑24.基于CAS加锁的读写队列互换机制25.binlog基于内存的......
  • 一种轻量分表方案-MyBatis拦截器分表实践
    作者:京东零售张均杰背景部门内有一些亿级别核心业务表增速非常快,增量日均100W,但线上业务只依赖近一周的数据。随着数据量的迅速增长,慢SQL频发,数据库性能下降,系统稳定性受到严重影响。本篇文章,将分享如何使用MyBatis拦截器低成本的提升数据库稳定性。 业界常见方案针对冷数......
  • sharding-jdbc分表场景下的分页查询优化
    背景欢迎来到Java学院,我们学院学员众多,每年都要招收新学员。但是,我们学院并没有“毕业”这一机制,所以年复一年学员的数量就越来越多。咱们学院每年都有一次大考,需要统计所有学员的成绩,并按排名的先后顺序公示给大家。第一年我们招收了1,000名学员。在一年过后,我们的公示栏分为......
  • ​Excel只能打印一部分表格的原因、解决方法
    怎么办?Excel文件打开之后,正常编辑完了,但是打印文件的时候只打印出表格文件的一部分数据,这是什么原因呢?怎么解决呢?原因一:如果你在打印界面,预览打印内容的时候发现,内容是空的或者只有一个单元格,但是工作表中的表格数据并没有消失,就是没办法打印出整个表格。这是因为在打印设......
  • 一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案
    前言今天大姚给大家分享一款EFCore下高性能、轻量级针对分表分库读写分离的解决方案,开源(ApacheLicense)的EFCore拓展程序包:ShardingCore。ShardingCore项目介绍ShardingCore是一款开源、简单易用、高性能、普适性,针对EFCore生态下的分表分库的扩展解决方案,支持EFCore2+的所有版......