インデックス?なにそれ美味しいの? → パフォーマンス悪化で炎上した話

こんばんは!IT業界で働くアライグマです!

データベースを扱う開発者なら、一度は 「クエリが遅い!」 という問題に直面したことがあるのではないでしょうか?システムの開発初期は快適に動作していたのに、データが増えるにつれてレスポンスが遅くなり、最終的には「何もしていないのにサーバーが落ちた…」なんてことも。

その原因のひとつが「インデックスを適切に設定していないこと」 です。

本記事では、インデックスを適用しなかったことで発生した パフォーマンス悪化の実例 を紹介しながら、インデックスの重要性や正しい使い方について解説します。

インデックスとは?

データベースにおけるインデックスの役割

インデックス(Index)とは、データベースの検索速度を向上させるための仕組み です。書籍の索引と同じように、データの位置を素早く特定できるようになります。

例えば、users テーブルに 1,000,000 件のデータがあるとしましょう。

SELECT * FROM users WHERE email = 'example@example.com';

インデックスがないと、データベースは1行ずつ全件スキャン(フルテーブルスキャン) することになります。これでは検索に時間がかかります。

しかし、email にインデックスを貼ると、検索範囲が効率的に絞り込まれ、パフォーマンスが大幅に向上 します。

インデックスがないとどうなる?

  • データが増えるにつれ検索が遅くなる
  • クエリの実行時間が長くなり、タイムアウトが発生する
  • 高負荷がかかり、DBサーバーが悲鳴を上げる

特に、ユーザー数が増え続けるWebアプリでは、インデックスを適切に設計しないと パフォーマンスが著しく悪化し、最悪の場合はシステムがダウンする こともあります。

パフォーマンス悪化で炎上した実例

事例1:本番リリース後にAPIが激重に…

あるWebサービスで、ユーザー検索APIが急激に遅くなる現象が発生しました。

原因

  • users テーブルの email カラムにインデックスがなかった
  • 毎回 フルテーブルスキャン が発生し、リクエストが殺到するとDB負荷が増大

結果

  • APIのレスポンスが 秒単位 になり、ユーザーから「遅すぎる」とクレームが殺到
  • 最終的にはDBが高負荷でダウンし、緊急メンテナンスへ
  • インデックスを追加しただけで 数秒→数ミリ秒 に改善

事例2:ランキング機能を追加したらDBが炎上

あるECサイトで、新機能として 「売上ランキング」 をリアルタイム更新する機能を導入。しかし、本番環境で 突然サーバーが重くなり、サイトがダウン する事態に。

原因

  • orders テーブルの created_at にインデックスがなかった
  • 売上ランキングを計算する際、毎回 全件スキャン が発生

結果

  • クエリの実行時間が 数十秒 になり、DBの負荷が限界に
  • サーバーがスローダウンし、最終的にダウン
  • created_at にインデックスを貼っただけで、レスポンスが大幅に改善

インデックスを適切に活用する方法

どんなカラムにインデックスを貼るべきか?

以下のようなカラムには インデックスを貼ると検索速度が向上 します。

  • 検索条件でよく使われるカラム
    SELECT * FROM users WHERE email = 'test@example.com';
    

    email にインデックスを貼る

  • JOINでよく使うカラム
    SELECT * FROM orders JOIN users ON orders.user_id = users.id;
    

    user_id にインデックスを貼る

  • ソートやグルーピングで頻繁に使うカラム
    SELECT * FROM products ORDER BY price DESC;
    

    price にインデックスを貼る

インデックスを貼りすぎると逆効果?

インデックスは多用すればいいわけではありません。

  • INSERT/UPDATE/DELETEが遅くなる
    • インデックスが多いと、データ更新時に余計な処理が増えてしまう
  • ストレージを消費する
    • インデックスの数が増えると、ディスク使用量も増大

適切なバランスを考えて、本当に必要なカラムだけにインデックスを適用 することが大切です。

まとめ

「インデックス?なにそれ美味しいの?」なんて言っていると、本番環境で痛い目に遭います。

適切なインデックスを設定しないと、検索速度が低下し、最悪の場合はシステムダウンにつながります。しかし、適切にインデックスを活用すれば 数秒かかっていた検索が数ミリ秒に短縮され、アプリのパフォーマンスが劇的に向上 します。

インデックス設計のポイント

  • 検索やJOINに使うカラムには 適切にインデックスを貼る
  • 貼りすぎには注意(更新系の処理が遅くなる)
  • EXPLAINを活用してクエリの実行計画を確認 する

データベースのパフォーマンスチューニングは、Webサービスの成長とともに重要になります。本番環境で炎上しないためにも、日頃からインデックスの重要性を理解し、適切に活用しましょう!