bboyjing's blog

Mysql分库分表之Mycat学习笔记七【分片规则-ER分片表】

有一类业务,例如订单表和订单明细表,明细表通常会依赖于订单表,这类关系可以用Mycat的ER分片表来表示,字表的记录与所关联的父表记录存放在同一个数据分片上,也是为了避免了跨库Join。下面我们再构造一个order_detail表来实现ER分片规则。

修改schema.xml配置,在order表的table标签下添加childTable子标签

1
2
3
<table name="order" dataNode="dn1,dn2" rule="mod-long">
<childTable name="order_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
</table>

添加order_stats表的全局ID修改conf/sequence_conf.properties,添加如下内容

1
2
3
4
ORDER_DETAIL.HISIDS=
ORDER_DETAIL.CURID=0
ORDER_DETAIL.MINID=1
ORDER_DETAIL.MAXID=1000000000

重启Mycat

1
2
cd /opt/mycat
./bin/mycat restart

通过Mysql客户端连接Mycat,并新建order_detail表

1
2
3
4
5
6
7
8
mysql -h127.0.0.1 -P8066 -uroot -pbboyjing
use OrderDB;
mysql> CREATE TABLE order_detail (
-> `id` int(11) NOT NULL,
-> `order_id` int(11) NOT NULL,
-> `remark` varchar(50) NOT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在之前新建的java测试项目中生成代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Data
public class Order{
private Integer id;
private Integer status;
private Integer price;
private Long createTime;
}
@Mapper
public interface OrderDetailMapper {
@Insert("<script>"+
"insert into `order_detail`(id, order_id,remark) "
+ "values "
+ "(next value for MYCATSEQ_ORDER_DETAIL,#{orderDetail.orderId},#{orderDetail.remark}) "
+ "</script>")
void insertOrderDetail(@Param("orderDetail") OrderDetail orderDetail);
}
public void addOrderDetail(){
OrderDetail orderDetail;
for(int i = 1; i <=10; i++){
orderDetail = new OrderDetail();
int orderId = i % 2 == 1 ? 1 : 2;
orderDetail.setOrderId(orderId);
orderDetail.setRemark("this is detail from order--" + orderId);
orderDetailMapper.insertOrderDetail(orderDetail);
}
}

分别连上dn1和dn2看下数据:
图13

图14

写在最后

Mycat还有几种分片规则,其官网提供的文档写的也比较全面,可以自行去研究。该课题的学习笔记也暂时就写到这里,如果要部署到线上,还需要再进一步地深入研究,目前就当入门了。