我有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)
虽然我真的认为你应该规范你的模式,以便所有这些表合并为一个表(可能有一个合适的,索引的索引,指示原始数据库的列); 我认为,有了现状,你只有两个选择:
加入UNION到message表,因为你正在做(但正如你观察,这可能不是规模非常好):你可以定义一个VIEW保存在具有明确写明UNION每一次,但是这不会有任何性能优势.
如果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表中应该比以前的选项产生显着的性能优势.
| 归档时间: |
|
| 查看次数: |
6637 次 |
| 最近记录: |