在真实的环境中,我们会遇到分库分表的场景,这篇文章我们主要介绍下使用Mycat2进行分库分表之单库多表。
这里的单库多表其实大家都应该能理解,也就是在一个库中使用多个表,例如我们创建一个school的库,下面有学生表student1,student2,student3,student4等等,如下图:
接下来我们演示下使用mycat操作这个单库多表的情况。
一、准备一个mycat实例
mycat的安装我们在前面的文章《Mycat数据库中间件系列(一)Mycat2的安装教程》已经介绍过了,这里为了演示,我把我的安装已经初始化了,已经没有在配置主从了。
二、准备一个mysql实例
这里我们需要准备一个mysql实例,对于mysql的安装,在之前的文章也介绍过,详见:《centos如何使用docker安装mysql?》。
三、进入mycat配置单库分表
登录mysql实例,在上面上传一个名称为school的数据库:
create database school DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
此时我们就可以在mysql实例里面看到一个名为school的数据库,但是这个数据库目前还不在mycat上,所以在mycat上是看不到的,此时我们需要在mycat上使用注解创建一个schema,把这个school关联起来:
/*+ mycat:createSchema{ "customTables":{}, "globalTables":{}, "normalTables":{}, "schemaName":"school", "shardingTables":{}, "targetName":"prototype" } */;
此时我们就创建好了mycat与mysql实例关联的school数据库。接着我们在mycat的school下创建一张学生表:
CREATE TABLE `students` ( `student_id` bigint(11) NOT NULL COMMENT '学生id', `school_id` bigint(11) NOT NULL COMMENT '学校id', `class_id` bigint(11) DEFAULT NULL COMMENT '班级id', `student_name` varchar(20) DEFAULT NULL COMMENT '学生姓名', PRIMARY KEY (`student_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition BY mod_hash(student_id) tbpartition BY mod_hash(student_id) tbpartitions 2 dbpartitions 1;
备注:
1、这里我们指定的分库规则是根据student_id进行hash分库,指定的dbpartitions为1,代表的就是只有1个数据库。
2、这里我们指定的分表规则是根据student_id进行hash分库,指定的tbpartitions为2,代表的就是有两张表。
上面创建完了,我们看下mycat里面的库信息:
可以看到mycat下有一个students逻辑库,然后我们看下mysql实例下的school下面的表:
可以发现创建了两张分表。由此可以总结出:
使用mycat创建的分库分表原数据的表是放在mycat上的。 mysql实例仅供存储和查询使用,所以在mysql实例上创建的是多个分表。
四、插入数据测试
上面我们的分库分表策略就建立好了,这里我们使用mycat向student表插入两条数据:
INSERT INTO `school`.`students`(`student_id`, `school_id`, `class_id`, `student_name`) VALUES (1, 1,1,"张三"); INSERT INTO `school`.`students`(`student_id`, `school_id`, `class_id`, `student_name`) VALUES (2, 1,1,"李四");
然后我们去mysql实例上看看students_0表里面存了什么数据:
再看看mysql实例上students_1表里面存储了什么数据:
可以看到数据根据student_id进行了hash,然后把不同的数据插入到了不同的表中了。那么此时在mysql中查询我们要查询student_id为2的用户,就只能在students_0表里面查询,如果要查询student_id为1的用户,就只能在students_1表里面查询。但是我们通过mycat进行查询呢?
select * from students;
可以看到我们通过mycat查询到了所有的数据。
以上就是mycat配置分库分表的案例之单库多表的案例。
还没有评论,来说两句吧...