文章目录

  • 一、应对场景
  • 二、解决方案
  • 三、效果
  • 四、实现
    • 1. 过程概述
    • 2. 建库、建表、插数据、创建视图
    • 3. 配置 mycat 的 schema.xml
    • 4. 测试
      • navicat直接测试
      • java编程测试
  • 总结

一、应对场景

在微服务开发中,假设我们有两个服务,一个是作业系统,一个是admin用户权限系统,他们分别连接不同的库,里面有对应不同的业务表。

admin用户权限系统:

作业系统数据库:

这时我们想查询出指定学校下的,所有学员提交的作业,并且里面带上作业详情。

这个操作必须要连表查询,但是表都在不同的数据库中,怎么解决?

二、解决方案

Mycat中间件来做垂直分库

三、效果

我们先看看效果,后面再看实现

这里我们用mycat连接上面的两台数据库,直接在mycat那里做的连表查询
(只在mycat1.6.5版本及以上支持跨库连表,并且目前只支持两个表连接)

如果我们还需要返回其他表的信息,也就是我们不止要连接两个表,我们是要跨库关联多个表查询。

这时我们可以在每个数据库本身创建视图,然后用mycat对两个视图跨库关联查询

四、实现

1. 过程概述

  • 首先我们每个服务有自己单独的数据库,里面的表都不一样
  • 然后我们用mycat对这些表进行配置垂直方向的分库
  • 对外我们的服务访问的db连接是mycat(他会自动分发你的增删改查请求)
  • 查询的sql语句如果是跨库的,必须在这条语句前面加上mycat指定的一句注释

2. 建库、建表、插数据、创建视图

admin用户权限系统的 testdb1

create database testdb1;user testdb1;CREATE TABLE `organization`  (`id` bigint(20) NOT NULL,`name` varchar(255) DEFAULT NULL COMMENT '机构名称',PRIMARY KEY (`id`) USING BTREE
);
CREATE TABLE `user`  (`id` bigint(20) NOT NULL,`username` varchar(255) DEFAULT NULL COMMENT '用户名',`password` varchar(255) DEFAULT NULL COMMENT '密码',`full_name` varchar(255) DEFAULT NULL COMMENT '中文名(全名)',`organization_id` bigint(20) DEFAULT NULL COMMENT '机构id',PRIMARY KEY (`id`) USING BTREE
);INSERT INTO `organization` VALUES (1, '茂名市第一中学');
INSERT INTO `user` VALUES (1, '1159140456@qq.com', '123456', '李启业', 1);create view v_usermsg as (select a.*,b.name as org_name from user a left join organization b on a.organization_id = b.id
);

作业系统的 testdb2

create database testdb2;user testdb2;CREATE TABLE `homework`  (`id` bigint(20) NOT NULL,`name` varchar(255)  DEFAULT NULL COMMENT '作业名',PRIMARY KEY (`id`) USING BTREE
);
CREATE TABLE `homework_user`  (`homework_id` bigint(20) NOT NULL COMMENT '作业id',`user_id` bigint(20) NOT NULL COMMENT '用户id',PRIMARY KEY (`homework_id`, `user_id`) USING BTREE
);INSERT INTO `homework` VALUES (1, '一班的周五语文作业');
INSERT INTO `homework_user` VALUES (1, 1);create view v_homework_user as (select a.*,b.name as homework_name from homework_user a left join homework b on a.homework_id = b.id
);

我这里创建视图是因为:mycat最多只支持跨库的两个表的关联查询,想多个表我这里是通过视图

3. 配置 mycat 的 schema.xml

<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"><table name="user" dataNode="dn1"></table><table name="organization" dataNode="dn1"></table><table name="homework" dataNode="dn2"></table><table name="homework_user" dataNode="dn2"></table><table name="v_usermsg" dataNode="dn1"></table><table name="v_homework_user" dataNode="dn2"></table></schema><dataNode name="dn1" dataHost="host1" database="testdb1" /><dataNode name="dn2" dataHost="host2" database="testdb2" /><dataHost name="host1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="localhost:3306" user="root"password="123456"></writeHost></dataHost><dataHost name="host2" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.89.176:3306" user="root"password="root"></writeHost></dataHost></mycat:schema>

到这里就已经好了,启动mycat !

4. 测试

navicat直接测试

注意:必须带上注释!

/*!mycat:catlet=io.mycat.catlets.ShareJoin */
select * from homework_user a left join user b on a.user_id = b.id;/*!mycat:catlet=io.mycat.catlets.ShareJoin */
select * from v_homework_user a left join v_usermsg b on a.user_id = b.id;


java编程测试

我这里用的 mybatis-plus ,直接截图带过



总结

欢迎指出我的错误!

mycat 跨库间连表查询解决方案相关推荐

  1. 实现数据库的跨库join联表查询

    功能需求 首先要理解原始需求是什么,为什么要跨库join.举个简单的例子,在日志数据库log_db有一份充值记录表pay_log,里面的用户信息只有一个userid:而用户的详细信息放在主库main_ ...

  2. 事务 跨库事务 分布式事务及解决方案

    什么是事务? 本地事务 事务传播行为: 事务的四大特性 ACID 并发事务产生的问题可以分为4类 事务的隔离级别 什么是分布式事务 分布式涉及到的原理: CAP原理: BASE理论 柔性事务和刚性事务 ...

  3. MySQL 跨库分页/ 分表分页/ 跨库分页,为什么这么难?

    来源:https://www.cnblogs.com/yjmyzz/p/12149737.html 当业务数据达到一定量级(比如:mysql单表记录量>1千万)后,通常会考虑"分库分表 ...

  4. MySQL 跨库分页/ 分表分页,为什么这么难?

    以下内容来自公众号逆锋起笔,关注每日干货及时送达 来源:https://www.cnblogs.com/yjmyzz/p/12149737.html 当业务数据达到一定量级(比如:mysql单表记录量 ...

  5. 28.多表查询——跨关联关系的多表查询

    多表查询-跨关联关系的查询 Django 提供一种强大而又直观的方式来"处理"查询中的关联关系,它在后台自动帮你处理JOIN. 若要跨越关联关系,只需使用关联的模型字段的名称,并使 ...

  6. 交叉表 mysql_mysql交叉表查询解决方案整理

    交叉表是一种常用的分类汇总查询.使用交叉表查询,可以显示表中某个字段的汇总值,并将它们分组,其中一组列在数据表的左侧,另一组列在数据表的上部.行和列的交叉处可以对数据进行多种汇总计算,如:求和.平均值 ...

  7. kafka跨库同步mysql表_canal实时同步mysql表数据到Kafka

    准备 对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下 [mysqld] log-bin=mysql-bin ...

  8. Discuz DB层跨库映射关系表名前缀BUG修复后产生的新bug

    新的逻辑引入了新的bug,会导致在跨多库连接时,产生表名前缀映射混乱,需要再做逻辑上的修复. function table_name($tablename) {if(!empty($this-> ...

  9. mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

    主从关系 准备三台不同ip的虚拟机 (第一批)主从关系的配置 主192.168.47.131 配置/etc/my.cnf,在[mysqld]下配置 log-error=/var/log/mysqld. ...

最新文章

  1. 关于javascript闭包中的this对象
  2. python下载文件暂停恢复_python下载文件记录黑名单的实现代码
  3. 监督学习——随机梯度下降算法(sgd)和批梯度下降算法(bgd)
  4. AbpZero之企业微信---登录(拓展第三方auth授权登录)---第一步:查看AbpZero的auth第三方登录的底层机制...
  5. leetcode 290. 单词规律(Java版)
  6. 『设计模式』HR:不会设计模式,你好意思来面试?(面试必备设计模式)
  7. 2022年中国母婴新消费白皮书
  8. DB2数据库指定时间点恢复案例
  9. 类String的比较
  10. linux proc目录 是什么意思,linux 下proc目录里面有什么
  11. java点击展示word文档_【java】如何实现在线预览word文档?
  12. 英语单词速记(一直更新中......)
  13. 【P2P网络】磁力链接转换为种子文件 magnet to torrent .
  14. 沉梦云商城系统源码绿色版本
  15. 四位数中有几个七C语言,用4、0和7可以组成(    )个不同的三位数,其中最大的数是(    ),最小的数是(     )。——青夏教育精英家教网——...
  16. 【Selenium自动化测试】鼠标与键盘操作
  17. win10 win7 php,win10装win7双系统引导
  18. redis事务与持久化
  19. unity学习:控制人物的移动
  20. 强制用户在下次登录Linux时更改密码

热门文章

  1. Android反编译apk修改版本号重新打包签名详细教程(超详细)
  2. Microsoft Naive Bayes 算法——三国人物身份划分
  3. 吴恩达机器学习(十)特征和多项式回归
  4. Keil下AStyle自动格式化代码
  5. c++利用飞信API免费发短信
  6. 统计学3:中心极限定理、参数估计:点估计和区间估计(置信区间)
  7. matlab 飞机,飞机系统matlab建模
  8. 袋鼠云flinksql连接器构建
  9. 【运维面试】k8s的监控指标
  10. 盘点直播带货运营,选品数据分析,工具整理。