[shardingSphere 使用与场景1] shardingSphere与mybatis集成,分库分表

本文介绍了如何将ShardingSphere与MyBatis集成,实现数据库的分库分表。详细讲解了垂直分片和水平分片的概念,以及逻辑表、真实表、数据节点和绑定表的定义。同时,通过SpringBoot配置展示了ShardingSphere的使用,包括连接池的配置和SQL运行情况的分析。
摘要由CSDN通过智能技术生成

本章目的为了快速搭建 shardingSphere 所讲解,提一些基本概念。

分片

垂直分片

按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。 在拆分之前,一个数据库由多个数据表构成,每个表对应着不同的业务。

水平分片

水平分片又称为横向拆分。 相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。

SQL

逻辑表

水平拆分的数据库(表)的相同逻辑和数据结构表的总称。
例:用户表根据地区划分,tb_user_shanghai, tb_user_shenzhen等等,他們的逻辑表为tb_user

真实表

在分片的数据库中真实存在的物理表。
tb_user_shanghai, tb_user_shenzhen为真实表,也叫物理表

数据节点

数据分片的最小单元。
由数据源名称和数据表组成,例:portal.tb_user_shenzhen

绑定表

指分片规则一致的主表和子表。例如: t_order 表和 t_order_item 表,均按照 order_id 分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
例子:
在不配置绑定表关系时, 路由的 SQL

SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_0 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);

在配置绑定表关系后,路由的 SQL

SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);

广播表

指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表。

内核剖析

核心由 SQL 解析 => 执行器优化 => SQL 路由 => SQL 改写 => SQL 执行 => 结果归并 的流程组成
在这里插入图片描述

sharding 入门使用

项目集成框架

shardingSphere
使用 5.0.0-alpha 版本

<!-- spring-web -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>org.apache.shardingsphere</groupId>
	<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
	<version>${shardingsphere.version}</version>
</dependency>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.1.16</version>
</dependency>

<!-- mybatis -->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.1.3</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.18</version>
</dependency>

配置事务处理器

配置dataSource是在 shardingsphere-jdbc-core-spring-boot-starter 自动管理的, 可以直接使用。

@Configuration
public class DatabaseConfig {

    @Resource
    private DataSource dataSource;

    @Bean
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource);
    }
}

使用springboot 的 shardingSphere 配置

配置需注意:
1.连接池

若使用com.alibaba.druid.pool.DruidDataSource使用(url, username, password)
若使用com.zaxxer.hikari.HikariDataSource 使用(jdbcUrl,username,password)

2.开启使用

spring.shardingsphere.enabled=true

spring:
  shardingsphere:
    sharding:
      default-database-strategy: # 默认数据库策略
        standard:
          sharding-column: id
          sharding-algorithm-name: database-default
#      default-table-strategy: # 默认数据表策略
#        standard:
#          sharding-column: id
#          sharding-algorithm-name: table-default
    enabled: true
    props:
      sql-show: true
    datasource:
      common:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
      names: ds0,ds1
      ds0:
        url: jdbc:mysql://127.0.0.1:3306/db0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8
        username: root
        password:
      ds1:
        url: jdbc:mysql://127.0.0.1:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8
        username: root
        password:
    rules:
      sharding:
        broadcast-tables: tb_dict # 广播表
        key-generators: # 分布式主键策略
          snowflake: # 策略名自定义
            type: SNOWFLAKE
            props:
              worker-id: 123
        sharding-algorithms: # 数据分片策略
          table-order-id:
            type: INLINE
            props:
              algorithm-expression: tb_order$->{order_id % 5}
          table-intype:
            type: INLINE
            props:
              algorithm-expression: tb_view_log_$->{log_type}
          database-default:
            type: INLINE
            props:
              algorithm-expression: ds1
          database-inline:
            type: INLINE
            props:
              algorithm-expression: ds0
        tables: # 表配置
          tb_dict:
            key-generate-strategy:
              column: id
              key-generator-name: snowflake
          tb_order:
            actual-data-nodes: ds$->{0..1}.tb_order$->{0..4}
            table-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: table-order-id
            database-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: database-inline
            key-generate-strategy:
              column: order_id
              key-generator-name: snowflake
          tb_view_log:
            actual-data-nodes: ds0.tb_view_log_article,ds0.tb_view_log_product
            table-strategy:
              standard:
                sharding-column: log_type
                sharding-algorithm-name: table-intype
            database-strategy:
              standard:
                sharding-column: id
                sharding-algorithm-name: database-inline

shardingShere的SQL运行情况

  • Logic SQL 是代码中的SQL
  • Actual SQL 是物理库执行的SQL

插入SQL:
逻辑表:tb_view_log
物理表:tb_view_log_article,tb_view_log_product
SELECT id, user_id ,log_type from tb_view_log 根据分片规则,log_type字段数据分别插入到不同的数据表
在这里插入图片描述

查询SQL:
逻辑表:tb_view_log
物理表:tb_view_log_article,tb_view_log_product
SELECT id, user_id ,log_type from tb_view_log 根据分片规则,log_type字段向所有分片表查询数据并拼接起来
在这里插入图片描述

tb_view_log_article数据
在这里插入图片描述
tb_view_log_product数据
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霸道产品爱上我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值