分库分表进阶之广播表和绑定表配置实战

DBC 567 0

一、Sharding-Jdbc广播表介绍和配置实战

  • 什么是广播表
    • 指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致
    • 适用于数据量不大且需要与海量数据的表进行关联查询的场景
    • 例如:字典表、配置表
  • 注意点:
    • 分库分表中间件,对应的数据库字段,不能是sql的关键字,否则容易出问题,且报错不明显
  • 配置实战
    • 数据源新增ds1
    • ad_config表

分库分表进阶之广播表和绑定表配置实战插图

配置文件

#配置广播表
spring.shardingsphere.sharding.broadcast-tables=ad_config
spring.shardingsphere.sharding.tables.ad_config.key-generator.column=id
spring.shardingsphere.sharding.tables.ad_config.key-generator.type=SNOWFLAKE

AdConfigMapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.xdclass.model.AdConfigDO;
import net.xdclass.model.ProductOrderDO;



public interface AdConfigMapper extends BaseMapper<AdConfigDO> {
}

AdConfigDO

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



@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ad_config")
public class AdConfigDO {

    private Long id;

    private String configKey;

    private String configValue;

    private String type;

}

Test

    @Test
    public void testSaveAdConfig(){

        AdConfigDO adConfigDO = new AdConfigDO();
        adConfigDO.setConfigKey("banner");
        adConfigDO.setConfigValue("xdclass.net");
        adConfigDO.setType("ad");

        adConfigMapper.insert(adConfigDO);

    }
温馨提示

大功告成,可以看到,我们两个库都有了相同的数据![aru_42]
分库分表进阶之广播表和绑定表配置实战插图2
分库分表进阶之广播表和绑定表配置实战插图4

二、Sharding-Jdbc水平分库+水平分表配置实战

  • 库表结构
    • 2个数据库、每个库2张表
  • 需求
    • 插入订单数据,分布在不同的库和表上
  • 操作
    • 建立库表
    • 分库分表配置
      • 分库规则 根据 user_id 进行分库
      • 分表规则 根据 product_order_id 订单号进行分表

关键代码

分库分表进阶之广播表和绑定表配置实战插图6

#配置分库规则
spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.algorithm-expression=ds$->{user_id % 2 }
# 指定product_order表的分片策略,分片策略包括【分片键和分片算法】
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{id % 2}
  • 单元测试
  • SQL分析
  • 数据库和表的下标如果不想从0开始,则hash取模后+1
    • {user_id % 2+1}

单元测试

分库分表进阶之广播表和绑定表配置实战插图8

三、Sharding-Jdbc绑定表介绍和配置实战

  • 什么是绑定表
    • 指分片规则一致的主表和子表
    • 比如product_order表和product_order_item表,均按照order_id分片,则此两张表互为绑定表关系
    • 绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升

分库分表进阶之广播表和绑定表配置实战插图10

首先先配置类添加

# 指定product_order_item表的分片策略,分片策略包括【分片键和分片算法】
spring.shardingsphere.sharding.tables.product_order_item.actual-data-nodes=ds$->{0..1}.product_order_item_$->{0..1}
spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.sharding-column=product_order_id
spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.algorithm-expression=product_order_item_$->{product_order_id % 2}

#配置绑定表
spring.shardingsphere.sharding.binding‐tables[0] = product_order,product_order_item
温馨提示

绑定表的添加,让我们不会发送无效的sql,优化查询的效率!

发表评论 取消回复
表情 图片 链接 代码

分享