41

私は 2 つの異なるサーバーserver1とを持っていますserver2が、今は と を持っdb1server1db2ますserver2。このようにMySQLでこれら2つのテーブルを結合しようとしています。

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

これは一種のハックであり、結合ではありませんが、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   |
+--------|-----+

少なくとも私の使用例では、これにより 2 つのクエリがすばやく結合され、出力が結合と同等になり、必要なツールに出力をパイプできます。

あるクエリの id リストは、他のクエリのクエリ テキストになることに注意してください。この方法であまりにも多くのデータを「結合」すると、OS によってクエリの長​​さが制限される場合があります ( https://serverfault.com/a/163390 )。したがって、これは非常に大規模なデータセットには不十分なソリューションであることに注意してください。pymysql のような mysql ライブラリで同じことを行うと、この制限を回避できることがわかりました。

于 2019-02-12T22:24:23.643 に答える