2022-07-23 に開催された ISUCON12 の予選に参加してきたときのメモ。

チーム構成

チーム名

Oops!

メンバー

  • 2matzzz
  • nyaa
  • kjm

いつものメンバー。

選択言語

Go言語

スコア

Oops! のみのグラフ

  • Best/Latest 93,716
UTC Score
2022-07-23 10:12 2,759
2022-07-23 10:27 3,030
2022-07-23 13:23 727
2022-07-23 13:28 2,649
2022-07-23 13:34 2,929
2022-07-23 13:42 630
2022-07-23 13:49 3,571
2022-07-23 13:57 644
2022-07-23 13:58 999
2022-07-23 14:00 2,731
2022-07-23 14:03 2,800
2022-07-23 14:08 3,365
2022-07-23 14:10 611
2022-07-23 14:11 2,847
2022-07-23 14:19 686
2022-07-23 14:24 3,508
2022-07-23 14:28 665
2022-07-23 14:33 3,545
2022-07-23 14:34 587
2022-07-23 14:38 30
2022-07-23 14:40 2,651
2022-07-23 14:45 3,196
2022-07-23 15:11 3,757
2022-07-23 15:18 4,285
2022-07-23 15:19 8,179
2022-07-23 15:22 5,678
2022-07-23 15:24 8,336
2022-07-23 15:31 11,057
2022-07-23 15:37 14,902
2022-07-23 15:46 9,085
2022-07-23 15:48 15,602
2022-07-23 15:59 10,706
2022-07-23 16:01 1,660
2022-07-23 16:10 8,996
2022-07-23 16:25 14,346
2022-07-23 17:17 14,093
2022-07-23 17:19 15,292
2022-07-23 17:23 16,000
2022-07-23 17:31 17,528
2022-07-23 17:34 16,395
2022-07-23 17:41 16,892
2022-07-23 17:42 16,845
2022-07-23 17:44 16,547
2022-07-23 17:46 14,995
2022-07-23 17:51 17,342

結果

17,342 Oops! (36位)

方針

午前中に諸々準備やソースコードの読んだりした上で、話し合いを行い SQLite は辞めて MySQL に移行することにした。

最終的にチームでやったこと

10:00 - スコア 3,030

  • 初期実装のまま

13:00 - スコア 3,571

  • SQLite を MySQL へ移行
    • SQLite のデータをダンプするときに最新のスコアのみ取るようなクエリを書いた
    select distinct first_value(id) over win as id, tenant_id,player_id, competition_id, first_value(score) over win as score from player_score window win as (PARTITION BY tenant_id, competition_id,player_id ORDER BY row_num DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);
    
  • player, player_score にインデックスを追加

14:00 - スコア 3,545

  • Makefile にログのローテーションを自動化するタスクを追加
  • Playerのスコアを最新のものだけINSERTする形に変更

15:00 - スコア 15,706

  • N+1 改善
    • 参加者向け大会ごとのランキングAPI
    • 参加者向け参加者詳細情報取得API
  • 排他ロックをトランザクション使うように変更
  • 複数のINSERT Queryを一つにまとめる
    • テナント管理者向けテナントに参加者を追加API
    • CSV入稿

16:00 - スコア 14,346

  • ユニークID生成のところをRedis化

17:00 - スコア 17,342

  • データベースを専用インスタンスにする
  • MySQLをReplicationしSlaveノードを使うようにする