MySQL如何實(shí)現(xiàn)跨庫join查詢
MySQL實(shí)現(xiàn)跨庫join查詢
同服務(wù)器的不同庫
只需要在表名前加上db_name
select * from userdb.user u join orderdb.`order` o on u.id = o.user_id;
不同服務(wù)器的不同庫
1.查看配置 FEDERATED
SHOW engines;
如果是NO,需要改為YES.默認(rèn)是NO
在my.ini文件中增加一行,重啟MySQL 服務(wù)即可
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)建的表名必須在遠(yuǎn)程服務(wù)器存在,創(chuàng)建的字段也必須是遠(yuǎn)程表中的字段,可以比遠(yuǎn)程表的字段少,但是不能多,本地存儲引擎選擇:ENGINE =FEDERATED,
CONNECTION選項(xiàng)中的連接字符串的一般形式如下:
scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name
配置密碼作為純文本的話會存在安全問題,運(yùn)行show create table,show table status是可以見的
note:
- 本地表結(jié)構(gòu)必須與遠(yuǎn)程完全一樣
- 遠(yuǎn)程數(shù)據(jù)庫只能連接MySql;
- 不支持事務(wù);
- 不支持表結(jié)構(gòu)的修改
- 本地表更新,遠(yuǎn)程表也同步更新,反之亦然
- 刪除本地表,遠(yuǎn)程表不會刪除
數(shù)據(jù)庫跨庫join方案
最好不要出現(xiàn)跨庫join,應(yīng)該在設(shè)計(jì)的時(shí)候就避免。
將需要join的表放在同一數(shù)據(jù)庫,即便是分庫分表看能不能按相同維度分到一起。
或者看能不能設(shè)冗余字段,避免關(guān)聯(lián)查詢。
那如果無法避免跨庫join,也應(yīng)該走微服務(wù)API查詢,或者使用中間件實(shí)現(xiàn)。
比如:
1.調(diào)用兩個(gè)服務(wù)API分別查詢,再組裝數(shù)據(jù);
2.利用Canal,將數(shù)據(jù)同步到業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫;
3.將兩個(gè)服務(wù)的數(shù)據(jù)實(shí)時(shí)同步到一個(gè)只讀庫,然后在只讀庫查詢;
一定要跨庫join,MySQL也是可以支持的:
1.開啟FEDERATED引擎,修改my.ini(或my.cnf)文件新添加一行,內(nèi)容為federated,然后重啟MySQL。
2.在數(shù)據(jù)庫中建立遠(yuǎn)程表,通過參數(shù)CONNECTION='mysql://username:pwd@ip:端口/庫名/表名
3.直接在SQL語句使用join即可。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
PHP mysqli擴(kuò)展庫 預(yù)處理技術(shù)的使用分析
本篇文章,介紹了PHP mysqli擴(kuò)展庫 預(yù)處理技術(shù)的使用分析。需要的朋友參考下2013-05-05mysql存儲過程如何利用臨時(shí)表返回結(jié)果集
這篇文章主要介紹了mysql存儲過程如何利用臨時(shí)表返回結(jié)果集,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09連接MySql速度慢的解決方法(skip-name-resolve)
這篇文章主要介紹了連接MySql速度慢的解決方法(skip-name-resolve),需要的朋友可以參考下2015-09-09