如何在单条查询中使用多个MySQL连接实现跨库联合查询
可行实现方案
1 同实例同类型数据库(不同库、不同鉴权账号)
如果两张表在同一个数据库实例下,只是分属不同逻辑库、用不同账号鉴权,可先给其中一个账号授予另一个库的表查询权限,直接在单条SQL中带上库名查询即可:
SELECT * FROM db1.table_a a JOIN db2.table_b b ON a.id = b.a_id
对应Laravel写法:
\DB::connection('mysql_1')->select('SELECT * FROM db1.table_a a JOIN db2.table_b b ON a.id = b.a_id');
2 跨实例同类型数据库(如均为MySQL)
如果两张表在不同物理实例,可使用对应数据库的远程表映射功能,以MySQL为例用FEDERATED存储引擎:
- 第一步:确认目标实例MySQL开启FEDERATED引擎,执行
show engines检查FEDERATED状态为YES即可,未开启则在my.cnf中加入federated配置重启 - 第二步:在
mysql_1连接对应的库中创建远程表映射,指向mysql_2实例的目标表:
CREATE TABLE `table_b_federated` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a_id` int(11) DEFAULT NULL, -- 其他字段和mysql_2中的table_b完全一致 PRIMARY KEY (`id`) ) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 CONNECTION='mysql://mysql2用户名:mysql2密码@mysql2主机地址:端口/库名/table_b';
- 第三步:直接在
mysql_1连接中写单条关联查询即可,完全符合你需要的调用形式:
\DB::connection('mysql_1')->select('SELECT * FROM table_a a JOIN table_b_federated b ON a.id = b.a_id');
注意:FEDERATED引擎不支持事务,大表关联性能较差,适合小数据量查询场景。
3 异构数据库(如MySQL+PostgreSQL)
如果两张表属于不同类型的数据库,可使用对应数据库的外部数据包装器(FDW)功能:
- PostgreSQL可使用
postgres_fdw、mysql_fdw插件映射其他数据库的表到本地 - SQL Server可使用链接服务器功能
- 映射完成后同样可在单条SQL中直接关联查询
4 通用跨数据源方案
如果需要支持多种数据源、大数据量关联查询,可部署Trino/Presto这类多数据源查询中间件,统一对接所有数据库后,可直接写标准SQL跨任意数据源关联查询,无需修改原有数据库配置。
内容的提问来源于stack exchange,提问作者emmaakachukwu
相关产品推荐
相关产品推荐

