一、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); }
二、Sharding-Jdbc水平分库+水平分表配置实战
- 库表结构
- 2个数据库、每个库2张表
- 需求
- 插入订单数据,分布在不同的库和表上
- 操作
- 建立库表
- 分库分表配置
- 分库规则 根据 user_id 进行分库
- 分表规则 根据 product_order_id 订单号进行分表
关键代码
#配置分库规则 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}
单元测试
三、Sharding-Jdbc绑定表介绍和配置实战
- 什么是绑定表
- 指分片规则一致的主表和子表
- 比如product_order表和product_order_item表,均按照order_id分片,则此两张表互为绑定表关系
- 绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升
首先先配置类添加
# 指定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
本文作者为DBC,转载请注明。