1時間ごとに実行するように設定されたcronタブを使用して行を削除しています。パフォーマンスと断片化を減らすために、これを行う最善の方法は何ですか?
また、削除が完了した後に最適化テーブルを実行する必要がありますか?
1時間ごとに実行するように設定されたcronタブを使用して行を削除しています。パフォーマンスと断片化を減らすために、これを行う最善の方法は何ですか?
また、削除が完了した後に最適化テーブルを実行する必要がありますか?
答えは、データと一度に削除する行数によって異なります。
可能であれば、(行ごとに1つのクエリではなく)単一のクエリで行を削除します。例えば:
DELETE FROM my_table WHERE status="rejected"
可能であれば、WHERE句でインデックス付きの列を使用してください。これは、全表スキャンを実行せずに削除する必要のある行を選択するのに役立ちます。
すべてのデータを削除する場合は、TRUNCATETABLEを使用します。
単一のクエリでデータを削除するとパフォーマンスの問題が発生する場合は、削除する行数を制限し(LIMIT句を追加して)、削除プロセスをより頻繁に実行してみてください。これにより、削除が時間の経過とともに広がります。
ドキュメントによると、テーブルの大部分を削除した場合、または可変長行のテーブル(VARCHAR、VARBINARY、BLOB、またはTEXT列を持つテーブル)に多くの変更を加えた場合は、OPTIMIZETABLEを使用する必要があります。
テーブルの最適化は非常にコストがかかる可能性があります。可能であれば、データを削除し、テーブルを1日1回(夜間)最適化してみてください。これにより、ユーザーへの影響が制限されます。