在上一篇文章《Mycat数据库中间件系列(五)Mycat2实战分库分表之单库多表》我们介绍了在一个数据源上创建一个单库多表,最后的结果是有1个school数据库,同时有2张students表,这篇文章我们介绍在在一个数据源上建立多个库多个表。
背景案例:
对school库进行分库,根据school_id进行分库 对student表进行分表,根据student_id进行分表 最后的结果是2个school库,每个school库对应2张表,也就是总共2个school库,4张students表
下面我们直接来演示一下,这里的演示还是在这篇文章《Mycat数据库中间件系列(五)Mycat2实战分库分表之单库多表》的环境下进行演示。
一、首先准备一个mysql实例,再准备一个mycat实例
这里我们已经提前准备好了。
二、登录mycat客户端,创建一个school库
在做多库多表的时候,mycat会管理一个元数据信息库,所有的分库和分表都是由mycat的元数据信息库通过路由配置进行管理的,因此这里我们只需要首先登录一下mycat客户端,创建一个名称为school的数据库。
create database school DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
当我们执行创建库成功之后,在mycat实例和mysql实例上都可以看到一个school的数据库。接着我们使用mycat在school下创建一张studetns表
create database school DEFAULT CHARSET utf8 COLLATE utf8_general_ci; CREATE TABLE IF NOT EXISTS `school`.`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 CHARSET = utf8 DBPARTITION BY mod_hash(school_id) DBPARTITIONS 2 TBPARTITION BY mod_hash(student_id) TBPARTITIONS 2;
这里我们指定使用students表的school_id进行分库,使用students表的student_id进行分表。执行下
执行建表语句之后,我们就可以在mysql实例上看到school_0和school_1这两个库,并且每个库下面都有两张表。这里我们使用mycat在单数据源上创建多库多表就完成了。
三、向students表中插入4条数据
这里我们使用mycat向studetns表中插入4条数据,查看下这四条数据分别存储在哪
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,"李四"); INSERT INTO `school`.`students`(`student_id`, `school_id`, `class_id`, `student_name`) VALUES (3, 2,1,"王五"); INSERT INTO `school`.`students`(`student_id`, `school_id`, `class_id`, `student_name`) VALUES (4, 2,1,"赵六");
这里执行成功,没有任何问题:
首先看看school_0库下的students_0表的数据
再看看school_0库下的students_1表的数据
再看看school_1库下的students_0表的数据
再看看shcool_1库下的students_1表的数据
以上可以看到数据被根据school_id进行hash,放到了不同的库里面了,同时又被根据student_id进行hash,放到了不同的表里面了。
四、测试查询
从上面第三步可以看到数据被分别插入到了不同的库和表里面,那么在mysql实例里面进行查询的话,则需要挨个库表进行查询,我们试试在mycat上能否查出来全部的数据。
select * from students;
可以看到数据被查询出来了,也就说明使用mycat作为数据库中间件,可以完全对原始代码无任何侵入性,非常方便。
还没有评论,来说两句吧...