【问题标题】:Join tables from two different server连接来自两个不同服务器的表
【发布时间】:2012-06-22 06:33:33
【问题描述】:

我有两个不同的服务器server1server2,现在我在server1 中有db1,在db2 中有db2。 我正在尝试像这样在 MySQL 中加入这两个表。

Select a.field1,b.field2  
FROM  [server1, 3306].[db1].table1 a  
Inner Join [server2, 3312].[db2].table2 b  
ON a.field1=b.field2  

但我遇到了错误。在 MYSQL 中是可能的。

【问题讨论】:

标签: mysql


【解决方案1】:

是的,在 MySQL 中是可以的。

previously 也有类似的问题。您必须使用FEDERATED ENGINE 来执行此操作。思路是这样的:

您必须拥有一个基于另一个远程位置的表的联合表才能以您想要的方式使用。表的结构必须完全相同。

CREATE TABLE federated_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';

[Source Answer]

【讨论】:

  • 这对于大型数据库表来说非常慢。我仍在寻找更好的方法,但在许多情况下,FEDERATED 表的扩展性不够好,无法作为一种选择。
  • 嗨,你找到更好的解决方案了吗?
  • @NomanDilawar,嗨,我还没有寻找更好的方法。如果你找到了,我很乐意看到它。
  • 虽然不一样,但复制可能是一个很好的解决方案,具体取决于您的用例
  • @JohnHunt,我会反对这一点,正如你提到的那样,它不一样。复制没有加入来自不同服务器的表。
【解决方案2】:

复制将是替代且合适的解决方案。

server1 - db1 -> 复制到 server2。 (现在 db1 和 db2 将位于同一服务器 server2 中。加入将很容易)。

注意:如果 server2 在存储/进程等方面有足够的能力承担 db1 的负载,那么 wen 可以进行复制。正如@brilliand 提到的,是的,Federated 会做大量的手工工作,而且过程会很慢。

【讨论】:

    【解决方案3】:

    这有点像 hack,也不是连接,但我使用 bash 函数让它感觉像是在进行跨服务器查询:

    显式版本:

    tb2lst(){
        echo -n "("
        tail -n +2 - | paste -sd, | tr -d "\n"
        echo ")"
    }
    
    id_list=$(mysql -h'db_a.hostname' -ume -p'ass' -e "SELECT id FROM foo;" | tb2lst)
    mysql -h'db_b.hostname' -ume -p'ass' -e "SELECT * FROM bar WHERE foo_id IN $id_list"
    
    +--------|-----+
    | foo_id | val |
    +--------|-----+
    | 1      | 3   |
    | 2      | 4   |
    +--------|-----+
    

    我写了一些包装函数,我保存在我的 bashrc 中,所以我认为它只是一个命令:

    db_b "SELECT * FROM bar WHERE foo_id IN $(db_a "SELECT id FROM foo;" | tb2lst);"
    
    +--------|-----+
    | foo_id | val |
    +--------|-----+
    | 1      | 3   |
    | 2      | 4   |
    +--------|-----+
    

    至少对于我的用例来说,这可以足够快地将两个查询拼接在一起,使得输出等同于连接,然后我可以将输出通过管道传输到任何需要它的工具中。

    请记住,一个查询中的 id 列表最终会作为另一个查询中的查询文本。如果您以这种方式“加入”太多数据,您的操作系统可能会限制查询的长度 (https://serverfault.com/a/163390)。所以请注意,对于非常大的数据集,这不是一个糟糕的解决方案。我发现用 pymysql 之类的 mysql 库做同样的事情可以解决这个限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 2017-09-30
      相关资源
      最近更新 更多