MyCat2实践(7) - MyCat分库分表

环境搭建

运行下面注释语句,创建四个数据源,我这里128和129主机各创建一个读一个写的数据源

/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://192.168.50.128:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"123456"
} */

/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://192.168.50.128:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"123456"
} */

/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://192.168.50.129:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"123456"
} */

/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://192.168.50.129:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"123456"
} */

查看是否创建成功

/*+ mycat:showDataSources{} */

创建c0、c1两个集群,dw0、dr0作为一个集群,dw1、dr1作为一个集群

MyCat规定集群用c开头,数字为后缀,所以我们配置了c0、c1两个集群,后面创建分片表,会自动选择这两个数据源创建分片的库和表

/*! mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */

/*! mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]} */

查看集群是否创建成功

/*+ mycat:showClusters{} */

重启MyCat

./mycat restart

在MyCat中创建数据库,名称还是mydb1(因为前面MySQL配置了主从复制,只复制mydb1,所以这里还是叫mydb1,让129从机也能同步创建)

create database mydb1;

创建成功

广播表(全局表)

广播表是冗余在每个数据库中的公共表,具有全量的数据

创建一张字典表,在建表语句后加上BROADCAST,表示广播表

# mycat默认全局序列采用雪花算法
# 指定主键自增auto_increment时,主键默认填充雪花算法产生自增值
# 若想要使用mysql自身的递增,则不指定为自增字段auto_increment
create table mydb1.dict(
id bigint not null auto_increment primary key, 	
dict_code varchar(255) default null,
dict_name varchar(255) default null
) ENGINE=INNODB DEFAULT CHARSET=utf8 BROADCAST;

分片表

创建一张order订单分片表,执行下面语句

create table mydb1.t_order(
order_id bigint not null auto_increment, 	
order_no varchar(255),
user_id varchar(255),
amount decimal(10,2),
primary key(order_id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(user_id) tbpartition BY mod_hash(user_id) tbpartitions 1 dbpartitions 2;

其中dbpartition BY mod_hash(user_id) tbpartition BY mod_hash(user_id) tbpartitions 1 dbpartitions 2

dbpartition BY mod_hash(user_id)表示通过user_id字段取模来分库

tbpartition BY mod_hash(user_id)表示通过user_id字段取模来分表

tbpartitions 1 dbpartitions 2表示分到2个数据库中,每个数据库1张分片表

执行后刷新两个数据库

可以看到两台数据库按照后缀数字创建了两个物理库

下面插入几条数据查看一下情况

insert into t_order(order_id,order_no,user_id,amount) value(1,"123","100",200);
insert into t_order(order_id,order_no,user_id,amount) value(2,"123","100",300);
insert into t_order(order_id,order_no,user_id,amount) value(3,"123","101",600);
insert into t_order(order_id,order_no,user_id,amount) value(4,"123","101",800);
insert into t_order(order_id,order_no,user_id,amount) value(5,"123","100",500);
insert into t_order(order_id,order_no,user_id,amount) value(6,"123","101",300);

分别打开128、129两台数据库上的order表

128数据库上的t_order_0表

129数据库上的t_order_1表

可以发现,两个数据库的oder表中的数据,分别按照user_id取模后的结果来存放

再打开mycat的order表

其中的数据并不是按照我们插入的顺序显示的,而是t_ordr_0和t_order_1的拼接

接下来,创建一张t_order_detail表,存放订单的明细数据,与t_order表关联

create table mydb1.t_order_detail(
order_detail_id bigint not null auto_increment, 	
order_id bigint,
goods_name varchar(255),
primary key(order_detail_id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(order_id) tbpartition BY mod_hash(order_id) tbpartitions 1 dbpartitions 2;

插入一些关联的数据

insert into t_order_detail(order_id,goods_name) value(1,"苹果");
insert into t_order_detail(order_id,goods_name) value(1,"西瓜");
insert into t_order_detail(order_id,goods_name) value(2,"苹果");
insert into t_order_detail(order_id,goods_name) value(3,"橘子");
insert into t_order_detail(order_id,goods_name) value(4,"香蕉");
insert into t_order_detail(order_id,goods_name) value(5,"牛油果");
insert into t_order_detail(order_id,goods_name) value(5,"猕猴桃");
insert into t_order_detail(order_id,goods_name) value(6,"猕猴桃");

我们打开t_order_detail_0和t_order_detail_1两张表看一下数据

因为t_order_detail表是按照order_id取模分表的,所以保证了同一张订单的明细数据都在一张表中

执行下面连表查询语句,看看能否将数据关联查询出来

select * from t_order o left join t_order_detail od on o.order_id = od.order_id

显然是可以的,因为MyCat将order和order_detail作为一个具有关联关系的ER表

我们可以通过下面语句查看表的关系

/*+ mycat:showErGroup{} */

MyCat把具有关联关系的order和order_detail分为了同一组

分片规则

MOD_HASH:取模运算,支持数值、字符串类型

RIGHT_SHIFT:右移哈希,支持数值类型

YYYYMM:按年月,支持DATE、DATETIME

YYYYWEEK:按年周,支持DATE、DATETIME

YYYYDD:按年日,支持DATE、DATETIME

MMDD:按月日,支持DATE、DATETIME

STR_HASH:字符串哈希,支持字符串类型

  • 29
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值