MySQL データベースに関する質問があり、何が最も効率的かについて意見を求めたいと思います。
私の問題は次のとおりです。
ボード ゲーム Web サイトのプレミアム機能を開発しています。プレミアム機能の 1 つは、ユーザーがプレイしたすべてのゲームが「永久に」保存されることです (ユーザーが後で検索できるようにするため)。通常のユーザーの場合、18 か月以上前のゲームは削除されます。
ここで、通常の非プレミアム ユーザーのゲーム (18 か月以上前のもの) を削除し、プレミアム ユーザーのゲームを保持する効果的な方法を見つける必要があります。
単純化すると、2 つのテーブルが得られました (実際には、各ゲームの参加者を格納するテーブルがもう 1 つあります)。
ゲーム、
id=INT
play_date=DATETIME
end_score=INT
player_id_1=INT
player_id_2=INT
ユーザー、
id=INT
premium=BOOLEAN (true=enabled, false=not enabled)
ユーザー テーブルには 300.000 行以上が含まれていますが、ゲーム テーブルには数百万行が含まれています。毎日約 20.000 ゲームがゲーム テーブルに追加されます。
非プレミアム ユーザーから 18 か月以上前のゲームを削除する最も効率的な方法は何でしょうか。
これまでのところ、毎週月曜日の朝に、すべてのユーザーに対して 18 か月以上前のゲームを削除しました。
ここで、プレミアム値とゲームの日付を考慮する必要があります。
いくつかの解決策 (?):
- Games テーブルの何百万もの行について話していますが、テーブルを JOIN していますが、これはダメでしょうか?
- 18 か月より古い各ゲーム エントリを取得し、player_id_1 と player_id_2 から各ユーザー エントリを取得し、これらのいずれかがプレミアムである場合はゲームをそのままにし、18 か月より古い場合は削除します。したがって、1 週間で、これは 20k*7=140k 相当のゲームになる可能性があります。
- 1時間ごとに行うことを除いて、上記のソリューション。次に、取得して確認する必要があるゲームが約 1000 あります。
- ?? Games テーブルにある種のヘルパー変数を追加しますか? しかし、ユーザーがプレミアムの使用をやめたらどうなるでしょうか....
どんなヒントでも大歓迎です...