約 500,000 行を含む (現在 InnoDB) テーブルがあります。これは、実行するタスクのキューを表します。MySQL データベースに保存されます。
少なくとも 1 秒に 1 回、場合によってはより頻繁に継続的に、そこからデータを選択し、続いていくつかの行を更新します。1 日に 1 回、テーブルから古い行を削除します。
テーブルでデッドロックが発生し始め、これによりタスク処理が停止しました。これらのデッドロックは、夜間の prune 実行中に発生しました。DELETE、SELECT、および UPDATE の組み合わせは、本質的に何も生産的ではないことを意味していました。残念ながら、SHOW ENGINE INNODB STATUS の出力がありません。
これに対処するための最良の選択肢を知りたいです。コードがデッドロックを検出し、クエリを再発行することに注意してください。また、一致するすべての行を一度に削除すると、多くのアクティビティが見られるデータベース テーブルに負担がかかりすぎることをずっと前に発見したため、一度に削除を 10,000 行に制限し、必要なすべての行が削除されるまでクエリを再発行し続けます。剪定した。
次のオプションが表示されます。どれが最適かについての意見や、他のオプションの提案を希望します。
- 一度に削除する行数を減らす
- DELETE で指数バックオフを使用しますが、特定のワークロードを考えるとこれが役に立たないことを懸念しています
- MySQL のドキュメントに従ってテーブルをロックします。おそらく、削除中は SELECT ステートメントと UPDATE ステートメントをブロックすることを受け入れることができます。
- MyISAM テーブル タイプに切り替えます。最初はこのテーブルでトランザクションを使用していたため、InnoDB を使用しました。これはもはや当てはまりません。これが実行可能な解決策であるかどうかを知るには、詳細に精通していません。
- おそらくUPDATE LOW_PRIORITYを使用してください。DELETE は SELECT には影響せず、UPDATE のみに影響する可能性があり、これで十分な場合があります。