2017-06-24 18 views
1

私のMySQLテーブルには、20万以上のレコードが含まれています。私は私が mysqlテーブルから何百万ものレコードを削除する方法

Operation failed: There was an error while applying the SQL script to the database. ERROR 1205: 1205: Lock wait timeout exceeded; try restarting transaction SQL Statement: 

以下の言及としてエラーを得た上でクエリを実行している間

delete FROM mydb.dailyreportdetails where idDailyReportDetails>0 order by idDailyReportDetails asc limit 1000 ; 

を実行することにより、低屈折率から、それを削除したいすべてのMySQLのバックグラウンドでクエリを実行するための方法またはいずれかをそこに持っているされていますそれらのレコードを削除する高速な手順?

+0

不要なレコードを定期的に削除するために、一定の時間間隔でプロジェクトでcronジョブを実行することをお勧めします。 –

+0

はdailyreportdetailsテーブルのidDailyReportDetails列自動インクリメントキーですか?スキーマを共有してください。 – shashankqv

+0

この文は、何百万ものレコードではなく、最大1000個のレコードを削除します。明らかに、それは削除ではなく時間を費やしているクエリ部分です。 'idDailyReportDetails'はインデックスされていますか? – EJP

答えて

1

あなたが最初に続いてまっすぐ進むが選択から値を使用して、削除...

SELECT idDailyReportDetails 
    FROM mydb.dailyreportdetails 
    where idDailyReportDetails>0 
    order by idDailyReportDetails asc limit 1000,1 ; 

を削除するには、実際のIDを見つけることができる...

DELETE FROM mydb.dailyreportdetails 
     where idDailyReportDetails < ID; 
+0

私はそれを試みました。これ以上の提案... –

0

あなたがチェックすることができますInnoDBロック

SHOW ENGINE InnoDB STATUS; 

ステータスまたはエラーが表示されます。

あなたはそれがあなたの削除クエリを実行した後

set innodb_lock_wait_timeout=3000; 

を使用し、あなたの場合の時間を増やしたい場合。

-1

テーブルから行を削除する最も簡単な方法は、idで参照することです。これもバイナリログには適しています。したがって、いくつかのプログラミング言語を使用し、ループIDで新しいグループをフェッチしてから、WHERE idDailyReportDetails IN()節に明示的に記述して行を削除することが最善の方法です。

データベースが他のプロセスによって使用されている場合、範囲照会(WHERE id <)はロックのために常に失敗する可能性があります。

+0

しかし、必ずしも別のクエリを実行してからdeleteステートメントを実行する必要はありません。 – EJP

関連する問題