昏喽喽

vuePress-theme-reco Lio    2020 - 2025
昏喽喽

Choose mode

  • dark
  • auto
  • light
Home
Category
  • CentOS
  • Csharp
  • DataBase
  • DesignMode
  • Vue
  • FrontEnd
  • GLD
  • Kingdee
  • NetWork
Tags
TimeLine
Tools
  • Http请求
  • 日志配置
  • 加密解密
  • 验证码
  • Git命令
About
author-avatar

Lio

103

Articles

15

Tags

Home
Category
  • CentOS
  • Csharp
  • DataBase
  • DesignMode
  • Vue
  • FrontEnd
  • GLD
  • Kingdee
  • NetWork
Tags
TimeLine
Tools
  • Http请求
  • 日志配置
  • 加密解密
  • 验证码
  • Git命令
About
  • 性能优化
  • webApi优化
  • Mysql优化(一)
  • Mysql优化(二)
  • Mysql优化(三)

Mysql优化(三)

vuePress-theme-reco Lio    2020 - 2025

Mysql优化(三)

Lio 2021-12-26 学习笔记

# 分库分表

使用ShardingSphere-Proxy对mysql数据库进行分库分表

# 分表操作

  1. 安装Mysql,下载地址 (opens new window)

  2. 在mysql中创建seckillservices 库 和seckill表

CREATE TABLE `seckills` (
	`Id` INT(11) NOT NULL AUTO_INCREMENT,
	`SeckillType` INT(11) NOT NULL,
	`SeckillName` CHAR(255) NULL,
	`SeckillUrl` CHAR(255) NULL,
	`SeckillPrice` DECIMAL(18,2) NOT NULL,
	`SeckillStock` INT(11) NOT NULL,
	`SeckillPercent` CHAR(255) NULL,
	`TimeId` INT(11) NOT NULL,
	`ProductId` INT(11) NOT NULL,
	`SeckillLimit` INT(11) NOT NULL,
	`SeckillDescription` CHAR(255) NULL,
	`SeckillIstop` INT(11) NOT NULL,
	`SeckillStatus` INT(11) NOT NULL,
	PRIMARY KEY (`Id`),
	INDEX `ProductId` (`ProductId`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
; 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  1. ShardingSphere-Proxy下载及依赖包

    • 因为此工具使用java语言的,所以需要下载jdk,下载地址 (opens new window)

    • 下载mysql-connector-java-5.1.47.jar,下载地址 (opens new window)

    • 下载apache-shardingsphere-4.1.0-sharding-proxy,官网地址 (opens new window),下载地址 (opens new window),文档地址 (opens new window),开发者文档地址 (opens new window)

  2. 配置apache-shardingsphere-4.1.0-sharding-proxy

    • windows进入到sharding-proxy\apache-shardingsphere-4.1.0-sharding-proxy-bin\conf目录

    • 配置config-sharding.yaml

      # 先配置数据源(用于连接Mysql数据库)
      dataSources: # 数据源配置,可配置多个
      seckills_0: # 与 ShardingSphere-JDBC 配置不同
      url: jdbc:mysql://127.0.0.1:3306/seckillservices?serverTimezone=UTC&useSSL=false 
      username: root
      password: root
      connectionTimeoutMilliseconds: 30000
      idleTimeoutMilliseconds: 60000
      maxLifetimeMilliseconds: 1800000
      maxPoolSize: 50 
      # 然后配置逻辑数据库(用户客户端直接连接)
      schemaName: seckillservices-proxy
      # 然后进行分表配置(seckills分成两张表,一张seckills_0,一张seckills_1) 
      shardingRule:
      tables: #表
          seckills: #逻辑表名
              actualDataNodes: productdatasources_0.seckills_${0..1} #分2张表
              tableStrategy: #分表策越
                  inline:
                      shardingColumn: ProductId #分表字段
                      algorithmExpression: seckills_${ProductId % 2} #对ProductId取模分表 
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
    • 配置server.yaml准备(身份认证)

      # 先配置访问逻辑库的权限
      authentication:
          users:
              root:
              password: root
          sharding:
              password: sharding 
              authorizedSchemas: seckillservices-proxy 
      
      1
      2
      3
      4
      5
      6
      7
      8
  3. 启动apache-shardingsphere-4.1.0-sharding-proxy

    • 进入bin目录下,通过cmd启动start.bat 3307 # 3307为端口号

    • 连接逻辑数据库,在逻辑数据库下创建表,会在真实数据库下分别创建2张表

# 分库操作

  1. 在mysql中创建两个数据库seckillservices-1,seckillservices-2

  2. 在config-sharding.yaml中创建两个数据源

    dataSources:
        seckills-0:
            url: jdbc:mysql://127.0.0.1:3306/seckillservices-1?serverTimezone=UTC&useSSL=false
            username: root
            password: root
            connectionTimeoutMilliseconds: 30000
            idleTimeoutMilliseconds: 60000
            maxLifetimeMilliseconds: 1800000
            maxPoolSize: 50
    
    seckills-1:
        url: jdbc:mysql://127.0.0.1:3306/seckillservices-2?serverTimezone=UTC&useSSL=false
            username: root
            password: root
            connectionTimeoutMilliseconds: 30000
            idleTimeoutMilliseconds: 60000
            maxLifetimeMilliseconds: 1800000
            maxPoolSize: 50
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
  3. 创建分库规则

    shardingRule: #分片规则
        tables: #表
            seckills: #逻辑表名
                actualDataNodes: seckills-${0..1}.seckillservices #分2库2表
                #tableStrategy: #分表策越
                    #inline:
                        #shardingColumn: ProductId #分表字段
                        #algorithmExpression: seckillservices-${ProductId % 2} #对ProductId取模分表
                #keyGenerator:
                    #type: SNOWFLAKE #雪花算法生成唯一Id
                    #column: ProductId
        defaultDatabaseStrategy:
            inline:
                shardingColumn: Id #分库字段
                algorithmExpression: seckills-${Id % 2}  #对Id取模分库
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

# 分库分表操作

  1. 先在mysql中创建两个库seckillservices-1,seckillservices-2

  2. 在config-sharding.yaml中创建两个数据源

    dataSources:
        seckills-0:
            url: jdbc:mysql://127.0.0.1:3306/seckillservices-1?serverTimezone=UTC&useSSL=false
            username: root
            password: root
            connectionTimeoutMilliseconds: 30000
            idleTimeoutMilliseconds: 60000
            maxLifetimeMilliseconds: 1800000
            maxPoolSize: 50
    
        seckills-1:
            url: jdbc:mysql://127.0.0.1:3306/seckillservices-2?serverTimezone=UTC&useSSL=false
                username: root
                password: root
                connectionTimeoutMilliseconds: 30000
                idleTimeoutMilliseconds: 60000
                maxLifetimeMilliseconds: 1800000
                maxPoolSize: 50
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
  3. 创建分库规则

    shardingRule: #分片规则
        tables: #表
            seckills: #逻辑表名
                actualDataNodes: seckills-${0..1}.seckillservices-${0..1} #分2库2表
                tableStrategy: #分表策越
                    inline:
                        shardingColumn: ProductId #分表字段
                        algorithmExpression: seckillservices-${ProductId % 2} #对ProductId取模分表
                keyGenerator:
                    type: SNOWFLAKE #雪花算法生成唯一Id
                    column: ProductId
        defaultDatabaseStrategy:
            inline:
                shardingColumn: Id #分库字段
                algorithmExpression: seckills-${Id % 2}  #对Id取模分库
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
  4. 重启apache-shardingsphere-4.1.0-sharding-proxy,连接逻辑库

    • 在逻辑库下seckillservices-proxy下创建seckillservices表,会在2张真实数据库下分别创建2张seckillservices-0和seckillservices-1表

    • 然后分别在2张真实数据库表下分别添加数据,查看2张真实数据库表

# 分库分表扩展

  1. ShardingSphere-Proxy数据基于字符串字段分库分表。工具:ModShardingAlgorithm 基于取模的分片算法

  2. ShardingSphere-Proxy数据基于时间字段分库分表。工具:FixedIntervalShardingAlgorithm 基于固定时间范围的分片算法

  3. ShardingSphere-Proxy数据基于可变时间字段分库分表。工具:MutableIntervalShardingAlgorithm 基于可变时间范围的分片算法

  4. ShardingSphere-Proxy数据基于国定容量分库分表。工具:MutableIntervalShardingAlgorithm 基于可变时间范围的分片算法

# 读写分离