MySQL如何實現(xiàn)跨庫join查詢
MySQL實現(xiàn)跨庫join查詢
同服務器的不同庫
只需要在表名前加上db_name
select * from userdb.user u join orderdb.`order` o on u.id = o.user_id;
不同服務器的不同庫
1.查看配置 FEDERATED
SHOW engines;
如果是NO,需要改為YES.默認是NO
在my.ini文件中增加一行,重啟MySQL 服務即可
federated
2.在本地庫創(chuàng)建相同的表建立連接
CREATE TABLE `order` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_id` bigint NOT NULL, `product_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE =FEDERATED CONNECTION='mysql://root:123456@192.168.10.100:3306/orderdb/order';
注意:本地創(chuàng)建的表名必須在遠程服務器存在,創(chuàng)建的字段也必須是遠程表中的字段,可以比遠程表的字段少,但是不能多,本地存儲引擎選擇:ENGINE =FEDERATED,
CONNECTION選項中的連接字符串的一般形式如下:
scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name
配置密碼作為純文本的話會存在安全問題,運行show create table,show table status是可以見的
note:
- 本地表結構必須與遠程完全一樣
- 遠程數(shù)據(jù)庫只能連接MySql;
- 不支持事務;
- 不支持表結構的修改
- 本地表更新,遠程表也同步更新,反之亦然
- 刪除本地表,遠程表不會刪除
數(shù)據(jù)庫跨庫join方案
最好不要出現(xiàn)跨庫join,應該在設計的時候就避免。
將需要join的表放在同一數(shù)據(jù)庫,即便是分庫分表看能不能按相同維度分到一起。
或者看能不能設冗余字段,避免關聯(lián)查詢。
那如果無法避免跨庫join,也應該走微服務API查詢,或者使用中間件實現(xiàn)。
比如:
1.調(diào)用兩個服務API分別查詢,再組裝數(shù)據(jù);
2.利用Canal,將數(shù)據(jù)同步到業(yè)務系統(tǒng)數(shù)據(jù)庫;
3.將兩個服務的數(shù)據(jù)實時同步到一個只讀庫,然后在只讀庫查詢;
一定要跨庫join,MySQL也是可以支持的:
1.開啟FEDERATED引擎,修改my.ini(或my.cnf)文件新添加一行,內(nèi)容為federated,然后重啟MySQL。
2.在數(shù)據(jù)庫中建立遠程表,通過參數(shù)CONNECTION='mysql://username:pwd@ip:端口/庫名/表名
3.直接在SQL語句使用join即可。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
連接MySql速度慢的解決方法(skip-name-resolve)
這篇文章主要介紹了連接MySql速度慢的解決方法(skip-name-resolve),需要的朋友可以參考下2015-09-09