Fork me on GitHub

Mysql跨库操作

在 MySQL 中,操作多数据源(例如从库 A 和库 B)进行联查的情况,可以分为以下两种场景:

A 库和 B 库在同一个 MySQL 实例

当 A 库和 B 库在同一个 MySQL 实例下时,可以直接使用跨库联查查询。示例如下:

SELECT A.column1, B.column2
FROM A.table1 AS A
LEFT JOIN B.table2 AS B
ON A.id = B.id;

因为 MySQL 实例本身已经能够处理这种跨库查询。只需要确保你在查询时使用了正确的库名和表名即可。

A 库和 B 库在不同的 MySQL 实例

当 A 库和 B 库在不同的 MySQL 实例下时,跨实例联查会更复杂,因为 MySQL 不直接支持跨实例的联查。你有以下几种方法来实现跨实例联查:

使用应用层合并

在应用层进行联查。首先从一个数据库中提取数据,然后在应用程序中处理和合并这些数据。例如:

1.	从 A 库中查询数据并将其存储在应用程序中。
2.	从 B 库中查询数据并将其存储在应用程序中。
3.	在应用程序中执行联查逻辑来合并数据。

使用中间数据库

可以将 A 库和 B 库中的数据导入到一个中间数据库中(例如将两个库的数据同步到一个新的数据库中),然后在这个中间数据库中进行联查。这个方法可能涉及数据同步或 ETL(提取、转换、加载)过程。

使用 Federated 引擎(有限支持)

MySQL 提供了 Federated 引擎,允许在不同的 MySQL 实例之间访问表。你可以在一个 MySQL 实例中创建一个 Federated 表,它映射到另一个 MySQL 实例中的表。这使得你可以通过 Federated 表进行跨实例查询。例如:

1.	在 A 库的 MySQL 实例中创建一个 Federated 表,它指向 B 库的表。
2.	使用这个 Federated 表进行联查。
CREATE TABLE federated_table (
    id INT(11) NOT NULL,
    column2 VARCHAR(255),
    PRIMARY KEY (id)
)
ENGINE=FEDERATED
CONNECTION='mysql://user:password@host:port/B_database/table2';

-- 然后执行联查
SELECT A.column1, B.column2
FROM A.table1 AS A
LEFT JOIN federated_table AS B
ON A.id = B.id;

总结

同一 MySQL 实例:可以直接使用 SQL 语法进行跨库联查。
不同 MySQL 实例:需要借助应用层合并、中间数据库或 Federated 引擎等方法来实现跨实例联查。
上游库可以访问的情况下尽量只读取且用redis缓存.
上游数据库不可以访问的情况下用接口交互.

posted @ 2024-08-14 14:17  秋夜雨巷  阅读(32)  评论(0编辑  收藏  举报