12

いくつかの基準に基づいて、1 億行を超えるテーブルから約 10,000 行を削除する必要があります。クエリを実行すると、約 5 分かかります。説明計画 ( MySQL は をサポートしていないため、deleteクエリは に変換されます) を実行したところ、MySQL が間違ったインデックスを使用していることがわかりました。select *explain delete

私の質問は次のとおりです。削除中にどのインデックスを使用するかをMySQLに伝える方法はありますか? そうでない場合は、どうすればよいですか? 一時テーブルを選択して一時テーブルから削除しますか?

4

3 に答える 3

4

インデックス ヒント構文があります。//ETA: sadly, not for deletes

ETA: 走ってみましたANALYZE TABLE $mytableか?

それがうまくいかない場合は、2 つの選択肢があると思います。削除する前に問題のあるインデックスを削除し、後で再作成します。または、削除テーブルを目的のインデックスの別のテーブルに結合して、目的のインデックスが確実に使用されるようにします。

于 2010-05-27T20:40:40.743 に答える
1

MySQL が間違ったインデックスを選択したという状況に実際に遭遇したことは一度もありませんが、むしろ、インデックスがどのように機能するかについての私の理解が通常間違っていました。

この本をチェックしてみてください: http://oreilly.com/catalog/9780596003067

インデックスの仕組みやその他の調整オプションに関する優れたセクションがあります。

于 2010-05-27T20:41:15.643 に答える
0

他の回答で述べたように、MySQL はインデックスを使用できませんが、PRIMARY KEY インデックスを使用できます。

したがって、テーブルに PRIMARY KEY がある場合の最善の選択肢は、高速な SELECT を実行してから、行に従って DELETE を実行することです。できればトランザクションで、間違った行を削除しないようにします。

したがって:

DELETE FROM table WHERE column_with_index = 0

書き直されます:

SELECT primary_key FROM table WHERE column_with_index = 0=> 多くの行を返す

DELETE FROM table WHERE primary_key IN(?, ?, ?)=>?は、選択された主キーの結果に置き換えられます。

削除する行がそれほど多くない場合は、この方法がより効率的です。

たとえば、同じテーブルで同じデータを持つ例をヒットしました。

  • DELETE によって分析された 7499067 行: 12 秒

  • 適切なインデックスを使用して SELECT によって分析された 6 行: 0.10 秒
  • 最終的に削除される行は 0 行です
于 2018-08-05T07:09:36.003 に答える