我们知道,当表的数量大于一定限度的情况下,操作起来就非常慢
所以我们就可以把表分成拆分成多个表保存,
比如我一个user表,未拆分前,有五千万条数据,
我们就可以把它拆成10个表来保存,
当然你的主键是一个有序自增长的序列,这个自增长的ID必须在插入之前就分配,
可以参考分布式ID生成机制(下个博客介绍),
通过SHARDINGJDBC我们就可以设定一个规则,
比如每个插入库的ID我们可以取模,然后插入到对应的表中
比如我们把user表拆分成3个表: user_0,user_1,user 2
现在我们有10个要插入的user对象,10个对象的id分别为0,1,2,3,4,5,6,7,8,9
插入前我们就可以用ID%3,可以得到每个对象要插入的表
id为(0,3,6,9 )%3 为 0 插入到 user_0
id为 (1,4,7)%3 为 1 插入到 user_1
id为 (2,5,8)%3 为 2 插入到 user_2
大概的逻辑就是主要,下面是主要代码片段
1,配置文件
spring: shardingsphere: props: sql: show: true datasource: names: master,slave master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.89.129:3306/shrek-db?characterEncoding=utf-8 username: root password: 123456 slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.89.130:3306/shrek-db?characterEncoding=utf-8 username: root password: 123456 sharding: master-slave-rules: ds0: master-data-source-name: master #定义节点ds0的主库 slave-data-source-names: slave #定义节点ds0的从库 tables: user: actual-data-nodes: ds0.user_${0..2} #绑定user表所在节点 这里定义user_${0..2} 表示有3个表,查询的时候会查所有表 table-strategy: standard: sharding-column: id #分片规则的字段 precise-algorithm-class-name: com.shrek.msproject.algorithm.MyPreciseDayShardingAlgorithm #分片规则自定义类
2,写自定义规则类
public class MyPreciseDayShardingAlgorithm implements PreciseShardingAlgorithm<Integer> { @Override public String doSharding(Collection<String> collection, PreciseShardingValue<Integer> preciseShardingValue) { //preciseShardingValue是传入的对象信息,有操作对象的逻辑表名和传入的ID //这个返回的根据preciseShardingValue拼成的实际表名,比如 user_0,user_1等 return preciseShardingValue.getLogicTableName()+"_"+preciseShardingValue.getValue()%3; } }
下面是增加,查询的效果
1,增加效果,按ID插入主库的各个分表,从表同步主表数据。
2查询所有效果,会查询从库下配置信息下DS0节点的 ds0.user_${0..2},3个类
3,根据ID查询单个信息,根据ID取模定位到表查询出从库数据