2009-08-12 6 views
2

私は約250,000レコードのユーザーを持つテーブルを持っています。私はそれに約75,000レコードのステージングと呼ばれる別のテーブルがあります。ステージングには1つの列msisdnしかありません。ステージングの行数がでないことを確認するには、ユーザーのを確認します。MySQL JOIN完了までに時間がかかりすぎるクエリ

I私は小さなデータのサブセット上でテストしている次のクエリを、持っている、正常に動作するようです:

SELECT 
    s.* 
    FROM staging s 
     LEFT OUTER JOIN users u ON u.msisdn=s.msisdn 
     WHERE u.msisdn IS NULL 
私は完全なリストでこのクエリを実行しようとすると、問題はしかし、ある

250kユーザーの私はそれを止める前に1時間走った。このクエリを最適化する方法はありますか?

私は、ステージング中のデータのサブセット上でクエリを実行し始めているが、これは恐ろしくマニュアルです:

SELECT 
    s.* 
    FROM staging s 
     LEFT OUTER JOIN users u ON u.msisdn=s.msisdn 
     WHERE u.msisdn IS NULL 
    LIMIT 0,10000 

MSISDNは、ステージングテーブルの主キーであるが、それはテーブルの主キーではありませんユーザー。私はそれが重要であるかどうかはわかりません。

+0

クエリEXPLAINを実行して結果を投稿してください。両方のmsisdn列のインデックスが作成されていますか?その場合は、両方のテーブルでOPTIMIZE TABLEを実行します。 –

答えて

4

まず、EXPLAINコマンドを使用してMySQLが使用しているインデックスを確認できます。クエリの前にEXPLAINと書いてください。その結果、使用しているインデックスがあればそれが表示されます。たぶん25万レコードのデータセットではそれほど(比較的)小さなデータセットでは遅いとすれば、それは非常に効果的なインデックスを利用していないと思われます。

またそうのようなNOT EXISTSとしてクエリを書き換えるために役立つことがありますが、このクエリをスピードアップするために行うことができます

SELECT s.* FROM staging s 
WHERE NOT EXISTS (SELECT 1 FROM users WHERE users.misdn = s.misdn) 
1

各テーブルのmsisdn列にインデックスを挿入します。 usersのPKではないので、クラスタ化されていないインデックスを置く必要があります。それはあなたの質問をすばやくスピードアップするはずです。

0

これはどれくらい早くなるか分かりませんが、あなたは何かを試すことができます。

select msisdn 
from staging 
where msisdn not in (select msisdn from users) 

また、両方のテーブルのmsisdn列のインデックスが存在することを確認してください。それは物事をすばやく加速させるはずです。

1

もの:

  • を確認MSISDNは、両方のテーブルにインデックス付けされていることを確認し
  • テーブルを最適化する
  • *をmsisdnと置き換えます。
関連する問題