41

我有两个不同的服务器server1server2现在我有db1inserver1db2in server2。我正在尝试像这样在 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 中是可能的。

4

3 回答 3

46

是的,在 MySQL 中是可能的。

以前也有类似的问题。您必须使用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';

[来源答案]

于 2012-06-21T06:22:05.923 回答
3

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

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

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

于 2017-09-08T09:24:25.657 回答
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 库做同样的事情可以解决这个限制。

于 2019-02-12T22:24:23.643 回答