ISUCON に参加してきました。今回で 2 回目ですが、驚くほど手も足も出なかったので内容薄めです。
前回は三人での参加でしたが、今回はソロで参加してみました。
所感
最初は(SQLite の存在から目をそむけながら)MySQL の負荷を抑えたりしてそこそこ快調な出だしのつもりでしたが、それ以降スコアが上がることは無かったです。
練習はずっと MySQL でやっていたので SQLite との接し方が分からず、MySQL に移すことが前提の問題なんじゃないか?とか考え始めて、でも DB がでかすぎて全然移せない~~という感じで終わりました。
SQLite そのままでチューニングするという決断が出来ればもう少しましになっていたかも...。
やれたこと
ほとんど何も出来なかったので、逆にスコア向上に繋がったことを書こうと思います。
dispenseID
最初に MySQL の負荷を見たて、一意な ID を作るdispenseID
に対処しました。
ID は DB のインクリメントで作られていたようだったので、単純な変数にid += 1
したものを返すようにしました。
他の方の感想を見るに UUID とかでも良かったみたいです。
visit_history
閲覧履歴と思われるvisit_history
というテーブルへのクエリが重くなっていました。
created_at
が最小の物のみ必要なようだったので、追加時には既存データがあればスキップするようにしつつ、created_at
が最小のものに絞ったテーブルを別で作りました。
SELECT player_id, MIN(created_at) AS min_created_at FROM visit_history WHERE tenant_id = ? AND competition_id = ? GROUP BY player_id -- ↑ これが -- こうなった ↓ SELECT player_id, created_at AS min_created_at FROM visit_history2 WHERE tenant_id = ? AND competition_id = ?
感想
ソロ参加だったので厳しいだろうとは思っていましたが、そもそも戦いに参加できてない感じは悔しかったです。
とはいえ ISUCON 本も含めて得た知識はどこかで役立つ、というかすでに役立ったことがあり、大会もとても良い経験になりました。
来年リベンジしたい。