Mysql 从两个不同的服务器连接表
我有两个不同的服务器Mysql 从两个不同的服务器连接表,mysql,Mysql,我有两个不同的服务器server1和server2,现在我在server1中有db1,在server2中有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中是可能的。
server1
和server2
,现在我在server1
中有db1
,在server2
中有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中是可能的。
也有类似的问题。你必须用它来做这件事。这个想法是这样的:
您必须在另一个远程位置有一个基于该表的联邦表,才能使用您想要的方式。表的结构必须完全相同
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';
复制将是另一种合适的解决方案 server1-db1->复制到server2。(现在db1和db2将位于同一个服务器server2中。加入将很容易)
注意:如果server2在存储/进程等方面足以承担db1的负载,那么wen可以进行复制。正如@brilliand所提到的,联邦将使大量的手工工作变得缓慢 这是一种黑客行为,不是一种连接,但我使用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列表在另一个查询中作为查询文本结束。如果以这种方式“连接”太多数据,操作系统可能会限制查询的长度()。所以请注意,对于非常大的数据集来说,这是一个糟糕的解决方案。我发现对像pymysql这样的mysql库做同样的事情可以绕过这个限制。你可以尝试
联邦存储引擎,你可以使用联邦存储引擎。我认为你最好选择两个表,在php中获得它们的结果,并应用您可能需要的任何数据操作。对于大型数据库表,可能的重复操作非常缓慢。我仍在寻找更好的方法,但在许多情况下,联邦表的可扩展性不足以成为一种选择。嗨,你找到更好的解决方案了吗?@nomandlawar,嗨,我还没有找到更好的方法。如果你找到一个,我很想看看。虽然它不一样,复制可能是一个很好的解决方案,取决于你的使用case@JohnHunt,我反对,正如你提到的,这是不一样的。复制未连接来自不同服务器的表。