3

MySQLデータベースの期限切れエントリを削除しようとしています。作成または更新時に、lastBeatというフィールドがCURRENT_TIMEで更新され、次のクエリを使用して20秒より古い行をチェック/削除します。

DELETE * FROM `rmachines` WHERE
 `lastBeat` < (NOW() - 20);

NOW()の代わりにCURRENT_TIMEも試しました

2つのメインループがあります。

  1. rmachinesの行を毎秒更新します

  2. 削除クエリを実行します

2が迅速に実行された場合、時間が次の1分(つまり59〜60秒)にロールオーバーすると、期限が切れたかのように行が削除されます(つまり、期限が切れていないとしても!)。それ以外の場合は正常に動作します。

2が1秒間に1回実行される場合、これはそれほど目立たないので、「誤った有効期限」が発生することはめったにありませんが、「問題」を明らかにするために1秒間に5回実行します。

私は解決策を見つけ、テストし、同じシナリオで機能するようです:

mysqlデータベースの3か月より古い行を削除するジョブ

しかし、なぜ私の方法が機能しないのか誰かに教えてもらえますか?

4

1 に答える 1

7

NOW()を数値にキャストし、それから20を減算しています。代わりに、間隔を使用して20秒を引く必要があります。

NOW() - interval 20 second

違いはここで見ることができます:

SELECT NOW() - interval 20 second, NOW() - 20;

2010-06-11 00:06:49, 20100611000689.000000
                 ^^              ^^

時間は、後と前00:06:59を比較します。00:06:49000689

于 2010-06-10T22:10:55.623 に答える