簡體   English   中英

查詢多個數據庫的最佳解決方案

[英]query on multiple databases best solution

我有8個具有相同表的數據庫

db0
  tbluser |  id  |    name

db1
  tbluser |  id  |    name

db2
  tbluser

db3
   tbluser |  id  |    name

db4
   tbluser |  id  |    name

db5       
   tbluser |  id  |    name

db6       
   tbluser |  id  |    name

db7
   tbluser |  id  |    name

我有another table dbcommon ,其中保存了用戶消息

dbcommon
   message  |  id  |  sender_id  |  recipient_id

我的問題是我需要根據發件人ID和收件人ID查詢所有帶有用戶名的郵件

在mysql上執行此操作的最佳方法是什么?

我現在的方法是使用聯合將所有db1到db7用戶數據組合在一起,然后內部聯接到dbcommon中的消息,但是我不確定這是否可以,如果我在選擇用戶表和聯合時有上百萬的數據該怎么辦? 。

為了更好地理解我的問題。 我做了這個,但是我不會用。

select *, sender.nickname as sender_name, recipient.nickname as recipient_name
from dbcommon.message m
inner join
(
select * from db0.tbluser
union
select * from db1.tbluser
union
select * from db2.tbluser
union
select * from db3.tbluser
union
select * from db4.tbluser
union
select * from db5.tbluser
union
select * from db6.tbluser
union
select * from db7.tbluser
) as sender on m.sender_id = sender.id
inner join
(
select * from db0.tbluser
union
select * from db1.tbluser
union
select * from db2.tbluser
union
select * from db3.tbluser
union
select * from db4.tbluser
union
select * from db5.tbluser
union
select * from db6.tbluser
union
select * from db7.tbluser
) as recipient on m.recipient_id = recipient.id

雖然我確實認為您應該規范化架構,以便將所有這些表合並為一個表(也許有一個適當的,根據需要建立索引的列,用於指示原始數據庫); 我認為,按現狀,您只有兩種選擇:

  1. 像現在一樣,將UNION加入到message表中(但是,正如您觀察到的,這可能無法很好地擴展):您可以定義一個VIEW以節省每次都必須顯式聲明UNION ,但這不會有任何性能上的好處。

  2. 如果tbluser表都使用MyISAM存儲引擎,則可以使用MERGE Storage Engine定義其聯合表:

     CREATE TABLE dbcommon.tblusers LIKE db0.tbluser; ALTER TABLE dbcommon.tblusers ENGINE = MERGE UNION = ( db0.tbluser, db1.tbluser, db2.tbluser, db3.tbluser, db4.tbluser, db5.tbluser, db6.tbluser, db7.tbluser ) ; 

    將其連接到您的message表應該比以前的選項產生明顯的性能優勢。

您可以這樣使用:(但是對於同一個數據庫有多個數據庫不是一個好習慣。

select d1.* from db1.dbcommon d1 inner join db2.tbluser d2 on d1.sender_id = d2.id 
UNION
select d1.* from db1.dbcommon d1 inner join db2.tbluser d2 on d1.sender_id = d2.id

用這個:

 SELECT NOME_USER, NOME_MAQ 
 FROM anapula.utilizador as a
    INNER JOIN cyber.maquinas as b ON a.ID_USER = b.COD_USER;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM