實現資料庫的跨庫join

2021-07-25 23:34:49 字數 2093 閱讀 4495

科技優家

2016-12-27 15:49

首先要理解原始需求是什麼,為什麼要跨庫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等操作。

以mysql為例,鏈結表與常見的 myisam, innodb 等等,都是一種表的結構型別(稱之為 儲存引擎)。使用 show engines; 命令即可看到資料庫所支援的儲存引擎,預設 federated 引擎 是關閉的,我們需要去mysql配置檔案開啟它。

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

1.本地的表結構必須與遠端的完全一樣

2.遠端資料庫目前僅限mysql

3.不支援事務

4.不支援表結構修改

建表的語句如下

create table ***(...) 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等語句,間接進行跨庫操作啦

多機的跨庫資料庫Join查詢

1 在應用層把原來資料庫的join操作分成幾次的資料庫操作來完成。2 資料冗餘 3 借助外部系統 例如搜尋引擎 解決一些跨庫的問題。在網上查詢了相關的資料,並沒有很好的通過例子來進行說明的方法。下面這乙個可能是比較具體一點的跨機的資料庫join的例項了,摘入如下 於這裡 自己並沒有驗證是否可行 漂亮...

資料庫 資料庫表連線Join

一條sql join語句對應著關係代數裡的乙個join操作,它對關聯式資料庫裡乙個或多個表的列進行合併。ansi標準的sql規定了5種型別的join inner,left outer,right outer,full outer和cross。除此之外乙個表能夠對自身進行連線,即self join。以...

資料庫 join的解析

關於左連線和右連線總結 左連線where隻影向右表,右連線where只影響左表。1 left join select from table1 left join table2 where table1.id table2.id 左連線後的檢索結果是顯示table1的所有資料和table2中滿足whe...