4

一日中、新しい値が MySQL データベースに追加されます。このテーブルには 800 万行を超える行があります。古い値がたくさんあるので、Java プログラムの値の挿入を停止せずに、これらをクリーンアップしたいと考えています。

このクエリを MySQL に送信しています。

DELETE FROM `tablename`
WHERE `from` <= (date_add(now(), interval -20 DAY))

しかし何が起こるかというと、Java プログラムは新しい値をテーブルに追加しなくなります。Javaプログラムを編集せずにこれを処理する方法はありますか? クエリを cronjob として 1 日 1 回実行したいと思います。

パラメータ LOW_PRIORITY も使用してみましたが、違いはありません。

4

2 に答える 2

2

古い MyISAM db エンジンを使用しているようです。

残念ながら、MyISAM はテーブル レベルのロックを使用します。行が挿入、更新、または削除されると、そのテーブルに対する他のすべての変更は、その要求が完了するまで保留されます。あなたの場合、長時間実行すると、そのテーブルへのDELETEすべての s がブロックINSERTされます。

次のように、テーブル エンジンを InnoDB に変更することで改善できます。

ALTER TABLE mytable ENGINE = innodb;

INSERTInnoDB エンジンは完全にトランザクション対応であり、 、UPDATEまたはの間にテーブル全体をロックしないDELETEため、問題は解決するはずです。

于 2013-03-10T22:40:17.177 に答える
0

ストレージエンジンを変更する必要があると思います。を使用してこれを行いますが、MyISAM と Innodb の違いALTER TABLE tbl ENGINE = innodbに注意してください。

于 2013-03-10T22:49:48.607 に答える