2012-01-06 11 views
1

table1_shard1(シャード×120個の破片あたり1,000,000行)MySQLは大規模データ

id_user hash 

表2(100,000行)

value hash 

所望の出力にベストプラクティスに参加します関連付ける最速の方法を見つけようとしていますid_userを上記の表から削除します。

現在のクエリは30時間実行され、結果は表示されません。

SELECT 
    table1_shard1.id_user, table1_shard1.hash, table2.value 
FROM table1_shard1 
LEFT JOIN table2 ON table1_shard1.hash=table2.hash 
GROUP BY id_user 
UNION 
SELECT 
    table1_shard2.id_user, table1_shard2.hash, table2.value 
FROM table1_shard1 
LEFT JOIN table2 ON table1_shard2.hash=table2.hash 
GROUP BY id_user 
UNION 
(...) 
UNION 
SELECT 
    table1_shard120.id_user, table1_shard120.hash, table2.value 
FROM table1_shard1 
LEFT JOIN table2 ON table1_shard120.hash=table2.hash 
GROUP BY id_user 
+0

table2をメモリテーブルに読み込むのはどうですか?それは物事を少し速くするはずです。リンクの一部であるテーブルフィールド(table1.hashとtable2.hash)にインデックスが作成されていますか? – KKK

+0

シャードを1つのテーブルにマージできませんか?私は労働組合はあまりにも重いです。 –

+0

id_user、ハッシュ、および値のインデックス。 – reefine

答えて

0

は、まず、あなたがhashフィールド

のインデックスを持っているか、私はメインのクエリを実行すると

CREATE TEMPORARY TABLE IF NOT EXISTS tmp_shards 
SELECT * FROM table1_shard1; 

CREATE TEMPORARY TABLE IF NOT EXISTS tmp_shards 
SELECT * FROM table1_shard2; 

# ... 

(少なくとも一時的に)あなたは、クエリの前にいずれかであなたのテーブルをマージすべきだと思います

SELECT 
    table1_shard120.id_user 
, table1_shard120.hash 
, table2.value 
FROM tmp_shards AS shd 
LEFT JOIN table2 AS tb2 ON (shd.hash = tb2.hash) 
GROUP BY id_user 
; 

パフォーマンスの向上についてはわかりませんが、少なくともそれ以上aintainable。

+0

問題は120 x 1,000,000のデータは約250GBです。 – reefine

+0

3つのフィールドしかないテーブルでは、多くのメモリが必要になります。フィールドタイプは何ですか?あなたは 'hash'にインデックスを持っていますか –

+0

これらの3つのフィールド以外のデータはもっとたくさんあります。私はこの投稿の単純さのために除外しました。 – reefine

関連する問題