ISUCON12予選に参加してきました

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 本も含めて得た知識はどこかで役立つ、というかすでに役立ったことがあり、大会もとても良い経験になりました。

来年リベンジしたい。