詳解mysql跨庫查詢解決方案
1.第一種跨庫查詢,是在同一個mysql服務器下兩個不同的數據庫之間的聯查,關系如下圖
在同一個mysql服務器下,不同的兩個數據直接加上庫名就可以實現跨庫查詢瞭
select * from t_test1 t1, test2.t_test2 t2 where t1.id = t2.id
執行sql查詢到一下結果
2.第二種跨庫查詢,是在兩臺不同服務器(物理服務器)上分別安裝的mysql服務器,實現跨庫查詢,其實現原理類似一個虛擬映射,需要用到mysql的另一個存儲引擎Federated,FEDERATED存儲引擎訪問在遠程數據庫的表中的數據,而不是本地的表。
這個特性給某些開發應用帶來瞭便利,你可以直接在本地構建一個federated表來連接遠程數據表,配置好瞭之後本地表的數據可以直接跟遠程數據表同步。實際上這個引擎裡面是不真實存放數據的,所需要的數據都是連接到其他MySQL服務器上獲取。
mysql默認沒有開啟federated存儲引擎,需要在配置文件裡面開啟;
#在[mysqld] 下 添加 federated 然後重啟mysql服務就可以瞭 [mysqld] federated
如下圖:
#輸入命令查看引擎開啟狀態 show engines;
可以看到,已經開啟瞭
然後就可在test1數據庫上創建虛擬表瞭,將test2庫上t_test2表映射到test1庫上面
CREATE TABLE `t_test2` ( `id` int NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb3 COMMENT='遠程測試表t_test2' CONNECTION='mysql://root:[email protected]:3306/test2/t_test2' ; /** CONNECTION='mysql://root:[email protected]:3306/test2/t_test2' 這個配置是關鍵 root:代表遠程數據庫的用戶 123456:代表遠程數據的密碼 127.0.0.1:代表遠程數據庫的ip地址,域名也可以 test2:代表遠程數據庫的數據庫名稱 t_test2:代表遠程數據庫中的哪一張表 **/
執行sql語句
可以看到創建瞭一張t_test2的表,這張表其實不存在隻是一個遠程的映射而已
可以看到使用FEDERATED引擎
表創建完成後就可以寫sql瞭
select * from t_test1 t1, t_test2 t2 where t1.id = t2.id
可以看到執行結果
federated使用註意事項:
1.本地創建的表名必須在遠程服務器存在,創建的字段也必須是遠程表中的字段,可以比遠程表的字段少,但是不能多,本地存儲引擎選擇
2.對本地虛擬表的結構修改,並不會修改遠程表的結構
3.truncate 命令,會清除遠程表數據
4.drop命令隻會刪除虛擬表,並不會刪除遠程表
5.select count(*), select * from limit M, N 等語句執行效率非常低,數據量較大時存在很嚴重的問題,但是按主鍵或索引列查詢,則很快,如以下查詢就非常慢(假設 id 為主索引)
select id from db.tablea where id >100 limit 10 ;
到此這篇關於詳解mysql跨庫查詢解決方案的文章就介紹到這瞭,更多相關mysql跨庫查詢內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- MySQL之select、distinct、limit的使用
- MySQL 字段默認值該如何設置
- 教你使用VS Code的MySQL擴展管理數據庫的方法
- MySQL數據庫基本SQL語句教程之高級操作
- MySQL數據庫簡介與基本操作