2011-12-05 7 views
0

5つのテーブルに約4000万行の大きなデータベースがあります。私は、列が2番目のテーブルに存在しない値を持つ1つのテーブルから行を削除する必要があります。データを削除できませんでした。

DELETE FROM user_followersid WHERE followersIds_generatedId IN (SELECT * FROM generatedfollowers)

CREATE TABLE tempfollowersids as SELECT * FROM user_followersid WHERE followersIds_generatedId IN (SELECT generatedId from followersid WHERE followerId IN (SELECT * FROM topusers));

それは多くのを取る:私はいくつかの行を削除するだけでなく、私は別のテーブルに削除したくない行を挿入するクエリを記述しようとしている

削除の時間が経過し、最後に毎回失敗し、次のエラーが報告されます。

私は一度にLIMITを使用していくつかの行だけを削除しようとしましたが、それはまた多くの時間を費やしています。私はINが極端に遅いことを知っています。しかし、私はクエリを書くための代替方法を見つけることができません。

どのように行を削除する必要がありますか?

+0

より小さいバッチのレコードを削除する必要があります(つまり、where句に追加のフィルタを追加することで、削除するレコードの数を制限してください)、mysqlの設定を変更する必要があります。アドバイスについては、http://rackerhacker.com/2010/02/16/mysql-the-total-number-of-locks-exceeds-the-lock-table-size-2/を参照してください。 – dash

+0

'user_followersid.followersIds_generatedId'にインデックスがありますか? –

答えて

4

あなたが言う:

which a column has values that don't exist in the second table

だから、あなたのクエリがあってはならない。

DELETE FROM user_followersid 
WHERE followersIds_generatedId NOT IN 
    (SELECT DISTINCT id FROM generatedfollowers) 
+2

良い点。実際には、selectに基づいて行を削除する前に、selectを単独で実行し、結果の行をチェックすることをお勧めします。 –

+0

私はすでにそれをしました。 'generatedfollowers'は私が削除したい行のIDを含んでいます。だから私が書いた質問は正しい。申し訳ありませんが、質問は少し誤解を招く。 –

0

あなたIN声明:

DELETE FROM user_followersid 
WHERE followersIds_generatedId IN 
     (SELECT generatedId 
     FROM generatedfollowers 
    ) 

も同様に、EXISTSで書き込むことができますすることができます:

JOINと、:

DELETE uf 
FROM user_followersid AS uf 
    JOIN generatedfollowers AS gf 
    ON gf.generatedId = uf.followersIds_generatedId 

あなたは第三(参加)文でLIMIT xを使用することはできません。

関連する問題