FEDERATED 是一種存儲引擎,它不在本地存儲數據,而是通過連接遠程 MySQL 實例將遠端表映射為本地「虛擬表」。應用端像操作普通表一樣對其增刪改查,底層自動轉發 SQL 到遠端執行並返回結果。適用於微服務跨庫查詢、異構數據整合、只讀報表同步等場景。
my.cnf [mysqld] 區塊添加 federated,重啟實例。CREATE TABLE local_tbl (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50)
)
ENGINE=FEDERATED
CONNECTION='mysql://user:pass@remote_host:3306/remote_db/remote_tbl';
CONNECTION 字符串格式:mysql://用戶:密碼@主機:端口/數據庫/表。
| 操作 | 行為 | 說明 |
|---|---|---|
| 修改本地表結構 (ALTER TABLE) | ❌ 不同步遠端 | 本地元數據變更,遠端結構不變,易導致數據錯誤 |
| TRUNCATE TABLE | ⚠️ 清空遠端數據 | 慎用!會真正刪除遠端表所有行 |
| DROP TABLE | ✅ 僅刪本地虛表 | 遠端實表不受影響 |
| 事務支持 | ❌ 不支持 | 每條語句獨立提交,無法跨表回滾 |
| 索引同步 | ⚠️ 需手動保持一致 | 遠端加索引本地不知情,反之亦然,嚴重影響性能 |
SELECT COUNT(*)、SELECT * ... LIMIT M, N(大偏移)WHERE 非索引列 LIKE 'str%' LIMIT 1 —— 引擎會拉取所有匹配行到本地再做 LIMITWHERE id > 100 AND id < 150FEDERATED 適合數據量較小、訪問頻率低、以主鍵點查為主的跨實例只讀/少寫場景。不適合高並發、大數據量、複雜 JOIN、強一致性事務場景——請改用 CDC(如 Canal/Debezium)同步到本地或引入分布式中間件(ShardingSphere/MyCAT)。
用好 FEDERATED,能以極低成本打通實例孤島;用不好,則是性能事故的溫床。