2012-01-03 1 views
0

テーブルから大量のデータを削除する削除クエリがあります。クエリは次のようになります膨大なデータを削除する削除クエリの速度を上げますか?

While loop 

DELETE FROM table_name WHERE id=12345; 

End loop 

このクエリは1000個のデータをフェッチします。

ループが巨大であるだけでなく、クエリによって削除されるデータも非常に巨大です。その結果、システムは非常に遅くなります。それを最適化する方法が必要です。

注:ストレージエンジンInnoDBの

おかげ

+0

ループ全体がトランザクションで実行されますか?反復可能な読み取り分離レベルの長いトランザクションは、MySQLが常にデータを取得するためにロールバックログを読み取る必要があるため、パフォーマンスを低下させる可能性があります。 –

答えて

0

この応答は、ループは遅いプロセスの責任ではないことを、仮定に基づいています。

DELETEスピードを上げる方法はいくつかありますが、いくつかの方法は他よりも実用的です。最初に、多くのインデックス、多くのデータ行、おそらくは遅いハードウェア、またはサーバーへの接続が悪いなど、exacltyがDELETEクエリを遅くするかどうかを調べる必要があります。

1つの方法は、インデックスファイルの削除を別の方法で処理するQUICK -optionを使用することです。詳しくはMySQL-manualをご覧ください。

もう一つの方法は、次のようになります。

  1. 、あなたのテーブルをコピー元のテーブルを削除しますコピー
  2. でデータを削除し、
  3. は元のファイル名に処理されたコピーの名前を変更します。

作業テーブルから削除を分けること。このofcは、ここで話しているテーブルがトラフィックの多い場合や、外部キーなどを使用している場合には行われません。

+0

ループが遅いプロセスの原因ではありません。巨大な量のデータを '削除'するため、削除クエリが遅くなります(1000秒のデータ)。 QUICKはINNOdbで動作しますか?あなたが言及している他の方法に関しては、テーブルがエントリのlakhsで構成されている場合、それは動作しますか?それの中で数千を削除しようとしていますか? – Dora

+0

INNOdbでもすばやく動作します。テーブル構造がどのように見えるか、アプリケーションがそれをどのように扱うかを知らなければ、私の2番目のアプローチがプログラムにどのような影響を与えるかについてはっきりと言えません。 – Bjoern

関連する問題