2

我有 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
4

3 回答 3

5

虽然我真的认为您应该规范化您的架构,以便将所有这些表组合成一个表(可能有一个合适的、根据需要索引的列来指示原始数据库);我认为在现状下,你只有两个选择:

  1. 将 a 加入UNIONmessage表中,就像您目前正在做的那样(但是,正如您所观察到的,这可能无法很好地扩展):您可以定义 aVIEW以节省UNION每次都必须明确声明的情况,但这不会有任何性能优势.

  2. 如果tbluser表都使用存储引擎,您可以使用存储MyISAM引擎定义它们的联合MERGE

    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表应该比以前的选项产生显着的性能优势。

于 2013-06-11T07:49:02.750 回答
1

你可以像这样使用:(但是对于同一个数据库来说,这不是一个好习惯。

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
于 2013-06-11T07:47:42.100 回答
-1

用这个:

 SELECT NOME_USER, NOME_MAQ 
 FROM anapula.utilizador as a
    INNER JOIN cyber.maquinas as b ON a.ID_USER = b.COD_USER;
于 2014-01-09T16:41:49.843 回答