###### tags: `isucon` # ISUCON11 予選 参加記録 - リポジトリ: https://github.com/yoshi0202/isucon-2021 # やったこと ### 1. 画像をDBから切り離す isuテーブルのimageカラムに画像が入っていたので、それをファイルに保存するように変更する。nginxが静的ファイルとして配信するのがいいのかなと思ったが、URIからパラメータを取得するところや、リクエストに権限があるのかを確認するところなどのやり方が不明で、アプリケーションが処理をすることにした。ファイルに保存することにしても、初期データの取り出しや、isu情報全体を返すところの処理の変更など、色々考えることが多かった。 ### 2. configのオンメモリ化 configはinitializeの時にクエリパラメータで渡されて、それ以降変化しないので、データベースに入れるのではなく、global変数として、メモリ上に保存することにした。 ### 3. dbにindexを貼る uuidやwhereで絞っているもの、joinの時にkeyにしているものにindexを貼った。uuidとtimestampの両方でwhereやjoinしているところがあったので、複合indexを貼ると少し点数が伸びた ### 4. nginxのassetを静的ファイルとして配信 アプリケーションがassetsを返していたので、nginxの設定ファイルのlocationの部分をいじって、nginxが返すように変更 ### 5. isuとisu-conditionのN+1問題の解消 ### 6. insertのN+1問題の解消 TODOと書いてあったところにfor分の中にinsertでdbにデータを入れているところがあった。これをbulk insertに変更して、一つのクエリで複数のデータを入れるようにした。クエリを作成するのに時間がかかったため、終了5分前に実装が終わり、検証が十分にできなかった。この関数は最初は9割の確率で失敗する設定になっており、その割合をどうするのが適切なのかよくわからないままになった。 ### 7. サーバを複数台に分割する # 反省点, 感想 - 1_initialdata.sqlみたいなファイルがgit管理されておらず、編集した際に他のサーバで反映されずめんどくさかった。 - 開発環境では、リクエストの送り方がよく分からず試すことができないエンドポイントがあった。JIAに関するところは/initializeでjia_service_urlをクエリパラメータで渡す必要があり、その値がわからなかったため、開発環境で試すことができなかった。(これはどうするのが正解??) - [TODO]を最初の方の段階で見つけられず、その部分の十分な検証ができなかった -