我有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用户数据结合使用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
答案 0 :(得分:5)
虽然我确实认为您应该normalise您的架构,以便将所有这些表合并为一个表(可能有一个合适的索引,根据需要,列表示原始表数据库);我认为,根据现状,你只有两个选择:
将UNION
加入message
表,正如您当前所做的那样(但是,正如您所见,这可能无法很好地扩展):您可以定义{{3}节省每次必须明确说明UNION
,但这不会有任何性能上的好处。
如果tbluser
表都使用MyISAM
存储引擎,则可以使用VIEW
定义其联合表:
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
表应该会比以前的选项产生显着的性能优势。
答案 1 :(得分: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
答案 2 :(得分:-1)
使用此:
SELECT NOME_USER, NOME_MAQ
FROM anapula.utilizador as a
INNER JOIN cyber.maquinas as b ON a.ID_USER = b.COD_USER;