• トップ
  • ブログ一覧
  • 【ISUCON部】ISUCONの存在を知らなかったけど、ISUCON部に参加してみた
  • 【ISUCON部】ISUCONの存在を知らなかったけど、ISUCON部に参加してみた

    こやまん(エンジニア)こやまん(エンジニア)
    2023.06.05

    IT技術

    はじめに

    こやまん

    東京でバッグエンドエンジニア兼インフラエンジニアをやってます、こやまんです。

    今回、ISUCON部でブログリレーをやるとのことで、参加することになりました。よろしくお願いします。

    ISUCON部の前回の記事は下記となります。ChatGPT-4、自分も契約してみようかな..

    ISUCON部】ChatGPTWebプログラミング

    ISUCON部に入部した理由

    異業種からIT業界に転がり込んできた自分ですが、技術的知見が圧倒的に不足していると痛感している日々、少しでも技術に触れておきたい気持ちが強くありました。

    技術力を上げて良いサービスを構築したい、ついでに年収も更に上げたい そんな邪なのか純粋なのか分からない気持ちを抱きつつ、りっきー部長が作成したISUCON用のチャンネルにこれまた転がり込みました。

    ISUCON、イスコン、椅子コンテスト...? ぐるぐる回りそうな...ISUCONの存在をこれまで知りませんでしたが、Iikanjini Speed Up Contestということで、いい感じにスピードアップを図るコンテストだそうです。

    椅子

    早速ISUCONに触れてみる

    まずは、環境構築から始めました。Multipassとやらを使うようです。

    Multipassってナンナンダ...教えてChatGPT君

    というわけで、Multipassを使って仮想環境を作成して、ISUCONに触れてみました。

    作成直後の何も変更していないスコアが1158(スコア測定毎に多少のブレがあります)

    何をしたらスピードアップできるのか...とりあえずISUCONでは大体データベースを扱うようなので、インデックスを設定してみようと思います。

    INDEXって何だっけ?

    普段何気なく口にしている(かもしれない)インデックスですが、改めて役割と効果が出るケースについて確認してみます。

    • データベースのインデックスは、目的のレコードを効率良く取得するための索引
    • データの行数が多い、検索対象の値の重複が少ない場合に効果が大きい

    とりあえず、使われているクエリを適当に探してみます。

    1query = 'SELECT * FROM `comments` WHERE `post_id` = ? ORDER BY `created_at` DESC'

    こちらのクエリに対してEXPLAINを実行します。

    EXPLAINって何だっけ?

    • クエリがインデックスを使っているか、効率的に処理できているかを確認するコマンド
    1mysql> EXPLAIN SELECT * FROM comments WHERE post_id = 1 ORDER BY created_at DESC;
    2+----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
    3| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                       |
    4+----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
    5|  1 | SIMPLE      | comments | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 100359 |    10.00 | Using where; Using filesort |
    6+----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+

    ここで注目すべきは、

    • typeにALLが表示されていること
      • ALLやindexはデータ量が多いテーブルだとパフォーマンスに大きく影響する
    • keyにNULLが表示されていること
      • インデックスを利用できていない状態
    • rowsの数が大きいこと
      • インデックスを設定すると効果が大きい
    • ExtraにUsing filesortが表示されていること
      • OrderBy句のソート処理にインデックスが適用できず、FileSortを行っており、処理が遅くなっている可能性あり

    ひとまず、インデックスが使われてないため、インデックスを作成します。

    1ALTER TABLE comments ADD INDEX post_id_index(post_id);

    再度EXPLAINを実行してみると、

    1mysql> EXPLAIN SELECT * FROM comments WHERE post_id = 1 ORDER BY created_at DESC;
    2+----+-------------+----------+------------+------+---------------+---------------+---------+-------+------+----------+----------------+
    3| id | select_type | table    | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | Extra          |
    4+----+-------------+----------+------------+------+---------------+---------------+---------+-------+------+----------+----------------+
    5|  1 | SIMPLE      | comments | NULL       | ref  | post_id_index | post_id_index | 4       | const |   12 |   100.00 | Using filesort |
    6+----+-------------+----------+------------+------+---------------+---------------+---------+-------+------+----------+----------------+

    typeがrefになったこと、rowsが大幅に減少したことが確認できます。Extraを確認すると、Using filesort、つまり検索条件とソート条件の両方に利用できるインデックスが無いとの表示ですので、インデックスを作り直してみます。

    まずは、先ほど作成したインデックスを削除します。

    1ALTER TABLE comments DROP INDEX post_id_index;

    そして、降順のcreated_atを追加したインデックスを作成します。

    1ALTER TABLE comments ADD INDEX post_id_and_created_at_index(post_id, created_at DESC);

    インデックス名はidx_comments_xxとかの方が良かったかも...とか思いながらひとまず先に進みます。

    再度EXPLAINを実行して、ExtraがNULLになっていることを確認できました。

    1mysql> EXPLAIN SELECT * FROM comments WHERE post_id = 1 ORDER BY created_at DESC;
    2+----+-------------+----------+------------+------+------------------------------+------------------------------+---------+-------+------+----------+-------+
    3| id | select_type | table    | partitions | type | possible_keys                | key                          | key_len | ref   | rows | filtered | Extra |
    4+----+-------------+----------+------------+------+------------------------------+------------------------------+---------+-------+------+----------+-------+
    5|  1 | SIMPLE      | comments | NULL       | ref  | post_id_and_created_at_index | post_id_and_created_at_index | 4       | const |   12 |   100.00 | NULL  |
    6+----+-------------+----------+------------+------+------------------------------+------------------------------+---------+-------+------+----------+-------+

    スコアを測定してみると、10184 になりました。インデックスを追加する前と比べて、約9000ほどスコアが向上しました。

    スコアが目に見えるので分かりやすくて、とても楽しめそうです。インデックスも適切な貼り方を追求していけば更にスコアを伸ばせるはず。

    ライトコードISUCON部では、ナレッジをスプレッドシートにまとめているため、他のメンバーの対応を見てどんなことをすれば、どの程度の効果があるのかなどを確認でき、そんな対応があるのかと新鮮な気持ちで楽しく技術を学べています。

    最後に

    自分はまだガッツリ触れてなくて、戦闘力は10184です....違いました、スコアでした。ISUCON部ランキング1位のこまさんは330000...あと20万上げればどこかの宇宙人と張り合えそうです。

    やはり技術力・・・・!!

    技術力は全てを解決する・・・・!!

    今後も、ISUCONも業務も楽しんで行きたいと思います。こやまんよりお送りしました〜。

    というわけで、次回はたむけんさんです!

    こやまん(エンジニア)

    こやまん(エンジニア)

    おすすめ記事