2011-07-29 8 views
3

スプリットデータベースに関する質問があります。これは問題のクエリです:スプリットMySQLデータベース

SELECT COUNT(*) FROM monies.link_monies_new lcn ' 
     . 'INNER JOIN products.link l ON lcn.link_id = l.link_id ' 
     . 'INNER JOIN products.products_format af ON l.product_format_id = af.product_format_id ' 
     . 'INNER JOIN products.products_categories ac ON af.product_category_id = ac.product_category_id ' 
     . 'WHERE lcn.click_time BETWEEN FROM_UNIXTIME(1311721200) AND FROM_UNIXTIME(1311807600) ' 
     . 'AND ac.product_category_id = 1 

問題は、データベースの金額と製品が別のサーバーに存在することです。解決策は何ですか? 2つのクエリが必要ですか?私は少し失われています。

ありがとうございます!

答えて

4

http://dev.mysql.com/doc/refman/5.0/en/federated-use.html

私が正しくあなたの質問を理解している場合は、2つのデータベース間でテーブルを結合するクエリを持ちたい、とデータベースが別々のサーバに配置されます。

"monies"サーバーでクエリを実行すると仮定すると、moniesサーバーで "products"サーバーを指すフェデレーションテーブルを作成するとします。そうすれば、クエリは引き続き機能し、MySQLはマジックで物理的に別々のサーバ上にあるという事実を管理します。

パフォーマンスのチューニングは問題になる可能性がありますが、現在のようにクエリを機能させる最も簡単な方法です。

たとえば、「製品」と呼ばれる「monies」サーバーにローカルデータベースを作成することができます。

CREATE TABLE link (
    link_id  INT(20) NOT NULL AUTO_INCREMENT, 
    ....<<other columns from the link table>> 
    PRIMARY KEY (link_id) 
) 
ENGINE=FEDERATED 

CONNECTION='mysql://[email protected]_server:9306/products/link'; 

これで、何も変更せずに上記のクエリを実行することができました。

+0

あなたの答えはありがとうございますが、テーブルはすでに作成されています。テーブルが何百もある大きなシステムです。そのオプションはありません。 – luqita

+0

あなたはこれをどうやってやるかの例を教えてもらえますか?現在のテーブルをフェデレーションに変更する必要がありますか?私はこの仕事が複雑であるにもかかわらず、MySQLのちょっとしたことだ。ありがとう! – luqita

+0

新しいサーバーに移動しているときにデータを移行しなければならないので、事前にフェデレーテッド・テーブルを実装できます。 –