
インデックス?なにそれ美味しいの? → パフォーマンス悪化で炎上した話
こんばんは!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サービスの成長とともに重要になります。本番環境で炎上しないためにも、日頃からインデックスの重要性を理解し、適切に活用しましょう!