查询多个数据库最佳解决方案

val*_*ecx 2 mysql

我有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
Run Code Online (Sandbox Code Playgroud)

我有another table dbcommon用户信息保存的地方

dbcommon
   message  |  id  |  sender_id  |  recipient_id
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要根据发件人ID和收件人ID查询其中包含用户名的所有邮件

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

我现在的方法是将所有db1和db7用户数据组合使用union然后内部连接到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
Run Code Online (Sandbox Code Playgroud)

egg*_*yal 5

虽然我真的认为你应该规范你的模式,以便所有这些表合并为一个表(可能有一个合适的,索引的索引,指示原始数据库的列); 我认为,有了现状,你只有两个选择:

  1. 加入UNIONmessage表,因为你正在做(但正如你观察,这可能不是规模非常好):你可以定义一个VIEW保存在具有明确写明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
               )
    ;
    
    Run Code Online (Sandbox Code Playgroud)

    将此加入到您的message表中应该比以前的选项产生显着的性能优势.