3

私はサイトと 500 万行のデータベースを持っていますが、それは魅力的に機能しています。ただし、古いデータを「ログ」テーブルに配置して古いデータを削除するために、1 時間ごとにクリーンアップ cron ジョブを実行しています。この間、サーバーの応答は非常に遅くなります。PHP または MySQL を介してそのジョブの優先度を下げることは可能ですか?

4

5 に答える 5

5

クリーンアップで最も重いタスクは、LOW_PRIORITY を使用できる DELETE 操作だと思います。

MySqlマニュアル ページからの DELETE 構文:

tbl_name から[低優先度] [迅速] [無視] を削除します ...

と説明:

LOW_PRIORITYを指定すると、他のクライアントがテーブルから読み取らなくなるまで、サーバーは DELETE の実行を遅らせます。これは、テーブル レベルのロックのみを使用するストレージ エンジン (MyISAM、MEMORY、MERGE など) にのみ影響します。

于 2011-10-12T17:04:41.787 に答える
2

MYSQL には low-priority-updates のようなものがあります - ここに文書化されています -> http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_low-priority-updates

** MyISAM、MEMORY、MERGE ストレージ エンジンでのみ機能します ....

于 2011-10-12T16:44:53.823 に答える
1

ドキュメントで説明されているように、クエリに追加できLOW_PRIORITYます。したがって、クエリは次のようになります。

$sql = "INSERT LOW_PRIORITY INTO #__bet_oddslog (id, team1, team2, league, sport, time, q1, q2)"; $sql .= " SELECT a.id, a.team1, a.team2, a.league, a.sport, a.time, AVG(b.q1) as q1, "; $sql .= " AVG(b.q2) as q2 FROM #__bet_details as a, #__bet_1x2_best as b WHERE time<'".date('Y-m-d H:i:s', strtotime("now"))."' AND a.id=b.bet_id GROUP BY b.bet_id";
于 2011-10-12T17:02:01.873 に答える
1

考えられる解決策の 1 つは、スレーブ化されたレプリケーション サーバーで古いデータをコピーすることです。そうすれば、重い負荷は完全にそのスレーブ ボックスにかかります。スレーブでコピーが完了したら、マスターで削除できます。

于 2011-10-12T16:52:00.490 に答える
1

MYSQL の優先度の低いリクエストの 1 つにINSERT DELAYEDがあります。ただし、UPDATE や DELETE ではなく、INSERT でのみ機能します。

編集: DELETE も遅延する可能性があることを知っていました!

于 2011-10-12T16:49:18.010 に答える