IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> ShardingJDBC分表分库 -> 正文阅读

[大数据]ShardingJDBC分表分库

一、数据库分库分表规则

1、什么是垂直/水平拆分模式

垂直拆分:公司根据不同的业务来拆分成不同的数据库

应用场景:微服务(订单、会员、支付)

缺点:分布式事务问题

水平拆分:单张表数据量达到500w条,可能会遇到查询瓶颈,比如:分页和排序

将单张表数据放入到多个不同的数据库中,或者将单表拆分成N个子表存放进行查询

缺点:查询问题 分页/排序可能会引发内存溢出问题

2、基于客户端/服务器端实现分表分库区别

数据库中间件:mycat或者ShardingJDBC

基于服务器端-mycat:

优点:归并数据结果是完全解耦合,保证数据的安全性

缺点:效率偏低

基于客户端-ShardingJDBC

优点:效率高

缺点:归并数据结果没有实现解耦合,有可能会影响业务逻辑

原理:基于aop代理方式拦截改写sql

例如:select * from user -> select * from user_0, select * from user_1

3、单表达到多少数据量开始分表分库

【推荐】单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

4、数据库分表分库策略有哪些

取余/取模

按照范围分片

按照日期进行分片

按照月份进行分片

按照枚举进行分片

二进制取模范围分片

一致性hash分片

按照目标字段前缀指定的进行分区

按照前缀ASCII码和值进行取模范围分片

二、项目实例

1、application.yml

server:
  port: 9091
mybatis-plus:
  type-aliases-package: cn.itcloud.sharedingjdbc.entity
  mapper-locations: classpath:mapper/*.xml
  configuration:
    jdbc-type-for-null: null
  global-config:
    banner: false
    #db-config:
    # select-strategy: not_empty
    select-strategy: not_empty
    insert-strategy: not_empty
    update-strategy: not_empty
sharding:
  jdbc:
    datasource:
      names: ds-master #随便写
      #主库
      ds-master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/shardingjdbcdb?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
        username: root
        password: root
    #水平拆分的数据库(表)配置分库 + 分表策略 行表达式分片策略
    config:
      sharding:
        #        defult-database-strategy:
        #          inline:
        #            sharding-column: id
        #            algorithm-expression: shardingjdbcdb
        #            # 分表策略 其中user为逻辑表 分表主要取决于ID字段
        tables:
          user:  #user是逻辑表名称
            actual-data-nodes: ds-master.user_$->{0..1}  #0..1 从0到1
            table-strategy:
              inline:
                sharding-column: id
                #分片算法表达式
                algorithm-expression: user_$->{id % 2}
      #打印执行的数据库
      props:
        sql:
          show: true
#打印执行的sql语句
spring:
  main:
    allow-bean-definition-overriding: true

?2、pom.xml

最主要的的依赖

<!--io.shardingsphere-->
<dependency>
?? ?<groupId>io.shardingsphere</groupId>
?? ?<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
?? ?<version>3.1.0</version>
</dependency>
<!-- sharding-jdbc-spring-namespace -->
<dependency>
?? ?<groupId>io.shardingsphere</groupId>
?? ?<artifactId>sharding-jdbc-spring-namespace</artifactId>
?? ?<version>3.1.0</version>
</dependency>

<dependency>
	<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
</dependency>
<!--mybatis-plus-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.5.1</version>
</dependency>
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.79</version>
</dependency>
<!--常用工具类 -->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
</dependency>
<!--io.shardingsphere-->
<dependency>
	<groupId>io.shardingsphere</groupId>
	<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
	<version>3.1.0</version>
</dependency>
<!-- sharding-jdbc-spring-namespace -->
<dependency>
	<groupId>io.shardingsphere</groupId>
	<artifactId>sharding-jdbc-spring-namespace</artifactId>
	<version>3.1.0</version>
</dependency>

3、User实体类

package cn.itcloud.sharedingjdbc.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * @author zqing
 * @description: TODO
 * @date: 2022/3/11 14:58
 */
@Data
@TableName("user") //逻辑表名称:user,分表为:user_01,user_02
public class User {

    private Integer id;

    private String userName;

    private Integer age;

    public User(Integer id, String userName, Integer age) {
        this.id = id;
        this.userName = userName;
        this.age = age;
    }
}

4、UserMapper-分页查询和排序

package cn.itcloud.sharedingjdbc.mapper;

import cn.itcloud.sharedingjdbc.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @author zqing
 * @description: TODO
 * @date: 2022/3/11 15:01
 */
public interface UserMapper extends BaseMapper<User> {
    /**
     * 查询所有
     * @return
     */
    @Select("select * from user")
    List<User> getList();


    /**
     * 分页查询
     * @return
     */
    @Select("select * from user limit 0,2")
    List<User> getListPage();

    /**
     * 排序
     * @return
     */
    @Select("select * from user order by id desc")
    List<User> getListOrderBy();

    @Select("select *  from user where id = #{id}")
    List<User> getListById(Integer id);

}

项目源码:https://gitee.com/zqingcpu/SharedingJDBC.git

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:27:35  更:2022-03-16 22:31:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:54:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码