在 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快取.
上游資料庫不可以訪問的情況下用介面互動.