私はサイトと 500 万行のデータベースを持っていますが、それは魅力的に機能しています。ただし、古いデータを「ログ」テーブルに配置して古いデータを削除するために、1 時間ごとにクリーンアップ cron ジョブを実行しています。この間、サーバーの応答は非常に遅くなります。PHP または MySQL を介してそのジョブの優先度を下げることは可能ですか?
5 に答える
クリーンアップで最も重いタスクは、LOW_PRIORITY を使用できる DELETE 操作だと思います。
MySqlマニュアル ページからの DELETE 構文:
tbl_name から[低優先度] [迅速] [無視] を削除します ...
と説明:
LOW_PRIORITYを指定すると、他のクライアントがテーブルから読み取らなくなるまで、サーバーは DELETE の実行を遅らせます。これは、テーブル レベルのロックのみを使用するストレージ エンジン (MyISAM、MEMORY、MERGE など) にのみ影響します。
MYSQL には low-priority-updates のようなものがあります - ここに文書化されています -> http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_low-priority-updates
** MyISAM、MEMORY、MERGE ストレージ エンジンでのみ機能します ....
ドキュメントで説明されているように、クエリに追加でき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";
考えられる解決策の 1 つは、スレーブ化されたレプリケーション サーバーで古いデータをコピーすることです。そうすれば、重い負荷は完全にそのスレーブ ボックスにかかります。スレーブでコピーが完了したら、マスターで削除できます。
MYSQL の優先度の低いリクエストの 1 つにINSERT DELAYEDがあります。ただし、UPDATE や DELETE ではなく、INSERT でのみ機能します。
編集: DELETE も遅延する可能性があることを知っていました!