ISUCON14の学習ログ

## はじめに
この記事は[Progaku Advent Calendar 2024](https://qiita.com/advent-calendar/2024/progaku)の18日目の記事です
今回プログラミング学習コミュニティProgakuのメンバーとチームを組んでISUCON14に初めて参加しました。
ISUCON14に挑戦するにあたって学習したことなどをここにまとめたいと思います。

チーム名: 琉球覇王いな卍@喧嘩無双
メンバー: @masayasviel @rgj0830 

## 他メンバーの記事
https://qiita.com/masayasviel/items/37b5c90602d7867e98dd

https://qiita.com/rgj0830/items/e3a5e949166d40fb4c20

## 参考になった記事
#### ISUCON環境構築
- [ISUCON本で初めてのパフォーマンスチューニングに挑戦してみた](https://qiita.com/kaito_399/items/e1d8a383bacd534db641)
- [private-isuを解くための環境構築](https://qiita.com/masayasviel/items/353024f7f2e292572942)

#### my.cnfの設定
- バッファプールの適用
  - [innodb_dedicated_serverによるbuffer_poolの割り当て](https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0092)
  - [MySQLメモリのチューニング手順と、手軽に実施する方法を解説](https://www.manageengine.jp/products/Applications_Manager/solution_mysql-memory-tuning.html)
- [MySQLの設定ファイルについて](https://qiita.com/tsuzuki_takaaki/items/a3157a1287a6ac32a620)

#### DBクライアントMySQL接続
- [A5M2でサーバーのMySQLに接続した際の備忘録](https://qiita.com/YuichiTanaka007/items/a98b771dea96294e5175)
- [Host xxx is not allowed to connect to this MySQL server の対応](https://zenn.dev/ryo_kawamata/articles/mysql-connect-error)
- [【MySQL】MySQLの外部接続を許可する](https://tansunohazama.sakura.ne.jp/wordpress/%E3%80%90mysql%E3%80%91mysql%E3%81%AE%E5%A4%96%E9%83%A8%E6%8E%A5%E7%B6%9A%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B/)
- [MySQL ユーザ名＆ホストの変更](https://qiita.com/A-Kira/items/2f8595831aeb5cfb205e)
- [mysqlの疎通確認(ログイン確認)](https://qiita.com/sakito/items/7ddcbfb49edc7a50c6d7)

#### スロークエリログの解析
- [mysqldumpslowを使ってスロークエリログを解析してみる](https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0131)
- [MySQL EXPLAINの見方](https://qiita.com/Stuffy86/items/809540b73cacde951997)

#### alpの導入
- [ISUCON初心者向け講習会 アクセスログ (alp)](https://isucon-workshop.trap.show/text/chapter-3/2-AccessLog.html)

#### pproteinの導入
- [pprotein でボトルネックを探して ISUCON で優勝する](https://zenn.dev/team_soda/articles/20231206000000)

#### ISUCON13の過去問を解く上で重宝していた資料
- [ISUCON メモ置き場](https://www.tetsuzawa.com/docs/category/isucon-%E3%83%A1%E3%83%A2%E7%BD%AE%E3%81%8D%E5%A0%B4)
- [ISUCON13にニフティ社員で参戦してみた](https://engineering.nifty.co.jp/blog/23409)
- [ISUCON初心者向け講習会](https://isucon-workshop.trap.show/text/chapter-3/0-Github.html)

## やったこと
- AWSの学習と環境構築
- [private-isu問題集](https://github.com/catatsuy/private-isu?tab=readme-ov-file)に軽く触れる => [private-isuの回答](https://github.com/tatsujin-web-performance/tatsujin-web-performance)
- [ISUCON本](https://gihyo.jp/book/2022/978-4-297-12846-3)を読み込む
- [ISUCON過去問環境をAWSで再現するための一式まとめ](https://github.com/matsuu/aws-isucon)にある[ISUCON13の過去問](https://github.com/matsuu/aws-isucon/tree/main/isucon13)を解く

転職活動でかなり疲弊し、他のメンバーよりISUCONの学習で出遅れるといった状況だったため、やることを絞って学習に取り組みました。

ISUCON本を読了後、DB分割など記事から得た情報もありますが、基本的にISUCON本に記載されているテクニックをしっかり使い倒すことを意識してISUCON13の過去問をひたすら解いていました。

たったそれだけ？
。。。それだけなんです。

## 過去問を解く上で注力したところ
ISUCONでやることは、「ボトルネックの特定」と「ボトルネックの解消」なので、ボトルネックの特定手段の確立とボトルネックの解消の確立に注力しました。
具体的には以下の内容に取り組みました。

- ボトルネックの特定
  - SQLのボトルネックを特定
    - mysqldumpslowを使ったスロークエリログの特定
    - スロークエリログの詳細を確認するためにsqlのEXPLAINを使用
  - nginxのボトルネックを特定
    - alpを使用ったアクセスログの確認
- ボトルネックの解消
  - DB分割対応
  - インデックスの付与
  - 「prepare と interpolateParams=true」を設定
  - バッファプールサイズの設定
  - 不要なトランザクションの削除

## まとめ
初参加のISUCONで学習期間が約半年ほどと時間に限りがあったため、やることを絞って学習に取り組みました。
ISUCONが開催された当日は学習してきたことを結果に結びつけることが出来ましたが、詳細は参加した時の記事として別で書こうと思います。