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

标签 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

我有另一个表dbcommon,其中保存了用户消息

dbcommon
   message  |  id  |  sender_id  |  recipient_id

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

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

我现在的方法是使用 union 将所有 db1 到 db7 用户数据组合起来,然后内部联接到 dbcommon 中的消息,但我不确定这是否可以,如果我有数百万个数据怎么办 在用户表上 select 和 union 会很麻烦。

为了更好地理解我的问题。 我做了这个,但我不会使用它。

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

最佳答案

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

  1. UNION 加入到 message 表中,正如您当前所做的那样(但是,正如您所观察到的,这可能无法很好地扩展):您可以定义 VIEW以便不必每次都显式声明 UNION,但这不会带来任何性能优势。

  2. 如果tbluser表都使用MyISAM存储引擎,您可以使用The 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 表中应该会比之前的选项产生显着的性能优势。

关于mysql - 查询多个数据库的最佳解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17038517/

相关文章:

php - 通过 PHP 更新 MySQL 不工作

Mysql 嵌套并声明为数组

php - 用php编辑另一个页面的内容

php - mysql join 只返回第一行,而它应该是多行

mysql - 获取两个日期范围之间的行

php - 无法打开 phpMyAdmin (Windows)

php - MySQL 删除查询不起作用

php - 如何从 html 输入添加变量并在从 mysql 数据提取的 url 中显示

php - 用于执行 MySQL 和 XML 查找的抽象 PHP 类

php - MySQL 基础问题 : how to get rows from one table that are not in another table?