實現數據庫的跨庫join


功能需求

首先要理解原始需求是什么,為什么要跨庫join。舉個簡單的例子,在日志數據庫log_db有一份充值記錄表pay_log,里面的用戶信息只有一個userid;而用戶的詳細信息放在主庫main_db,里面有用戶的詳細信息表user_info,如用戶名、登錄時間、注冊時間、會員等級 等等。如果只是按用戶名查找充值記錄,那可以很簡單地分兩次查詢即可。但是更復雜的需求,比如按注冊時間排序,按會員等級統計等等,稍微復雜一點的功能,分次查詢就相當難以做到了。如果在同一個庫里,我們可以很方便的使用join關鍵字實現這些功能,但是在不同的數據庫里,並沒有跨庫查詢的SQL JOIN語句。那怎么辦呢?

方案一、字段冗余。也就是說把一部分信息重復存放,比如 pay_log表里除了userid字段還有user_name字段,等等。但是這只適合加少量字段,如果把注冊、登錄時間、等級等等都字段都重復一遍,那是顯然不科學的。

方案二、表復制和同步。也就是說把main_db里面的user_info表復制一份到log_db中,然后設置定時任務讓這兩個表進行同步。這樣確實是可以在一個庫里,然后可以進行 JOIN 等的復雜語句操作了。但是這兩個表的內容是重復的,未免會比較浪費空間。

方案三、鏈接表。什么是鏈接表呢?簡單來說,就是在log_db里有一個user_info表,但這個表並沒有存儲數據,而是直接鏈接到了 main_db里的user_info表。這樣的話,我們可以既無需定期同步,又可以像在同一個庫里使用JOIN等操作。

開啟 FEDERATED 引擎

以MySQL為例,鏈接表與常見的 MyISAM, InnoDB 等等,都是一種表的結構類型(稱之為 存儲引擎)。使用  show engines;  命令即可看到數據庫所支持的存儲引擎,默認 FEDERATED 引擎 是關閉的,我們需要去mysql配置文件開啟它。

開啟的方法很簡單,在windows下只需要在mysql的配置文件 my.ini 最末尾加上一句  federated ,然后重啟mysql即可。重啟后輸入 show engines;命令即可看到 FEDERATED 的 Support 變為 YES,表示federated引擎已經開啟。

新建鏈接表(federated引擎的表)

既然是鏈接的表,那么會有以下幾個限制:

1.本地的表結構必須與遠程的完全一樣
2.遠程數據庫目前僅限MySQL
3.不支持事務
4.不支持表結構修改

建表的語句如下

CREATE TABLE xxx(...) ENGINE=FEDERATED CONNECTION='mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]' 

當然不建議這樣自己手工從頭拼裝SQL語句,可以把mian_db的user_info表的結構導出來,然后修改最后的半句,再導進去就行啦。建表語句示例如下:

復制代碼
CREATE TABLE `user_info` (
  `userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶id',
  `username` varchar(60) NOT NULL DEFAULT '' COMMENT '帳號',
  `level` int(11) NOT NULL DEFAULT '1' COMMENT '等級',
  `log_dt` timestamp NOT NULL DEFAULT '2016-11-30 00:00:00' COMMENT '最后登錄時間',
  `reg_dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注冊時間',
  PRIMARY KEY (`userid`),
  KEY `idx_name` (`username`)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT CONNECTION='mysql://batsing:b8a7t4@localhost:3306/main_db/user_info'  COMMENT='用戶基本信息表-鏈接表';
復制代碼

 

經過這些步驟,我們就把另外一個庫的表,鏈接到了我們操作的庫上了。這樣就可以使用JOIN等語句,間接進行跨庫操作啦

原文地址:https://www.cnblogs.com/batsing/p/federated.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM