bboyjing's blog

Mysql分库分表之Mycat学习笔记五【分片规则--取模】

分片规则是这一类数据库中间件比较重要的部分了,Mycat提供了一些常用的分片规则,正常情况下应该是够用了。没法全部涉及到,我们挑一些学学,这一章来看一下最简单ID取模,具体的配置在第二章已经讲了,这里就不再贴出来了,测试项目上一章也已经建好,直接撸代码吧。

OrderMapper中添加方法

1
2
3
4
5
6
@Insert("<script>"+
"insert into `order`(id, status, price, create_time) "
+ "values "
+ "(next value for MYCATSEQ_ORDER,#{order.status},#{order.price},NOW()) "
+ "</script>")
void insertOrder(@Param("order") Order order);

添加测试方法

1
2
3
4
5
6
7
8
9
public void addOrder(){
Order order;
for(int i = 1; i <= 2000; i++){
order = new Order();
order.setStatus(i % 2);
order.setPrice(i);
orderMapper.insertOrder(order);
}
}

看到这里你们可以会想,个傻屌一条条插,不会批量啊。不是没尝试过,因为采用的本地文件的全局Sequence策略,在一个事物中通过next value for MYCATSEQ_ORDER获取的全局ID是同一个!!!如果采用其他方式获取全局ID的话,可以通过如下的批量方法插入数据。另外,之前说插入2000w条,实在是太慢了,就插个2000条玩玩吧。

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 批量新增订单
* @param orderList
*/
@Insert("<script>"+
"insert into `order`(id, status, price, create_time) "
+ "values "
+ "<foreach collection =\"orderList\" item=\"order\" index= \"index\" separator =\",\"> "
+ "(next value for MYCATSEQ_ORDER,#{order.status},#{order.price},NOW()) "
+ "</foreach > "
+ "</script>")
void batchInsertOrder(@Param("orderList") List<Order> orderList);

查看结果

1
2
3
4
5
#通过如下命令连上Mycat管理端口
mysql -h127.0.0.1 -P9066 -uroot -pbboyjing -dOrderDB
#查看节点信息,结果如下图
mysql> show @@datanode;

图7
上图看不出什么,之前我以为SIZE是节点的记录数,后来发现不是。下面还是分别连上两个节点确认下数据,为了看数据方便,直接用Navicat可视化客户端。下图分别是dn1、dn2的数据:
图8

图9
可以更详细的看出,数据均匀分布在两台机器上,达到了简单的水平分库的目的。