0
点赞
收藏
分享

微信扫一扫

mysql 使用federated引擎实现跨库 join 查询

Resin_Wu 2024-11-04 阅读 7

一般 MySQL 的关联查询都是在同一个数据库内,那如果要和不同的数据库进行关联查询,可以使用 MySQL 中的 FEDERATED 引擎,那什么是 FEDERATED 引擎

mysql 使用federated引擎实现跨库 join 查询_关联查询

图片来自 MySQL 官方文档

如图,FEDERATED 引擎的原理为:

  1. 远程服务器开启 FEDERATED 引擎支持
  2. 本地服务器查询 FEDERATED 引擎表时,会发送查询语句到远程服务器
  3. 远程服务器通过传过来的查询语句,查询出结果,返回给本地调用服务器

接下来以 Windows 系统为例,首先可以查看下本地数据库服务对 FEDERATED 引擎是否支持,使用下面命令

SHOW ENGINES;

结果如下

mysql 使用federated引擎实现跨库 join 查询_关联查询_02



可以看到默认是不支持的,这时可以修改启动配置文件 my.ini,在 [mysqld] 组增加 federated,然后重启服务,使数据库服务支持 FEDERATED 引擎,重启后结果如下

mysql 使用federated引擎实现跨库 join 查询_数据库_03

然后在本地数据库实例上新建两个数据库 remote (模拟远程数据库)和 local(模拟本地数据库),并在 remote 和 local 数据库新建测试表和测试数据

mysql 使用federated引擎实现跨库 join 查询_关联查询_04

 

mysql 使用federated引擎实现跨库 join 查询_MySQL_05

然后我们可以在 local 数据库中创建 t_remote 的 FEDERATED 引擎表

CREATE TABLE `t_remote`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `key1` varchar(10) DEFAULT NULL,
  `key2` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) 
ENGINE = FEDERATED
COMMENT='远程表' CONNECTION='mysql://root:123456@localhost:3306/remote/t_remote';

执行完结果如下

mysql 使用federated引擎实现跨库 join 查询_关联查询_06

可以看到 local 数据库中的 t_remote 表和 remote 数据库中的 t_remote 表数据库一样,这样就可以做关联查询了

mysql 使用federated引擎实现跨库 join 查询_数据库_07

如上,实现 MySQL 跨库关联查询。

 


附:CONNECTION 还可以使用另外一种方式

CREATE TABLE `engin_sys_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
  `username` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
  `password` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
  `state` int(4) DEFAULT NULL COMMENT '状态,1正常,0待审核,-1删除',
  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
  `operatortime` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=FEDERATED AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
CONNECTION='mysql://username:password@xxx.xxx.xxx.2:port/db/table'

另外,CONNECTION 还可以使用另外一种方式 (需要注意的是 SERVER , WRAPPER):

CREATE SERVER server_dz
    FOREIGN DATA WRAPPER mysql
    OPTIONS (HOST 'xxx.xxx.xxx.2',USER 'xxx',PASSWORD 'xxx' ,PORT 3306,DATABASE 'db');

执行后,建表语句中可以使用:CONNECTION='server_dz', 需要注意的是表名,要和 db1 中的保持一致

测试效果如下:
修改 db1 中 sys_user 的表数据后,再 db2 查看 engin_sys_user 的表数据,结果如下图:

举报

相关推荐

0 条评论