今回の問題は、対戦成績をデータ分析用に選手対選手で個別に保存していたことから始まります。
選手個人の総合成績をView処理で出力しまいした。
ただ・・・インデックス等がないのでめっちゃ計算時間が掛かるー!
ユーザーを少なく見積もって100ユーザーでも、1ユーザー最低10選手=1000選手持っています。
最大組み合わせ数は、1000選手×999選手=ほぼ100万・・・多すぎる(^^;
そういったものをSQLでSUMすればどうなるか。
そして、試合ごとに全選手を更新する。
もちろん重かった。
悲しかったです。
というわけで、対応策は下記の通りにしました。
・Viewではなく、総合成績の中間テーブルを作るようにしました。
・更新対象を狭め、自分と対戦相手の選手のみとしました。
改良前
個別成績テーブルスキーマ:
選手ID, 対戦選手ID, 試合数…
↓ 試合ごとにSQLでSUM(アクティブなユーザーの全選手)
総合成績Viewスキーマ:
選手ID, 試合数…
↓
各種データ呼び出し
改良後
個別成績テーブルスキーマ:
選手ID, 対戦選手ID, 試合数…
↓ 試合ごとに自分と対戦相手の選手の成績だけ、SQLでSUM
総合成績テーブルスキーマ:
選手ID, 試合数…
↓
各種データ呼び出し
結果
試合の待ち時間5~10秒(またはエラー)が、2秒以内に収まるようになりました。
SQLをテキトーに設定していたのですが、やっぱりちゃんと考えて書かないとダメですね。
いい教訓になりました。