1. 導入:なぜ今、インデックスの見直しが必要なのか
データベース運用において、クエリのレスポンス低下はシステム全体のボトルネックとなります。インデックスは「本の索引」のように、目的のデータへ高速に辿り着くための道しるべです。しかし、闇雲に作成すれば良いわけではありません。本記事では、MySQLでのインデックス作成手法を整理し、実務で役立つ基礎知識を解説します。
2. 基礎知識:インデックスの種類と役割
インデックスを作成する際、主に以下の2つの手段と目的に区別されます。
手段:
・CREATE INDEX文: 単独でインデックスを作成する際に用いられる、標準的で読みやすい構文。
・ALTER TABLE文: テーブル構造を変更する際に用いられ、制約(UNIQUEなど)と合わせて設定する場合によく使われます。
目的:
・通常インデックス: 検索速度の向上を目的とします。重複データやNULL値の混在が許容されます。
・UNIQUEインデックス: 検索速度向上に加え、「データの重複を禁止する」という整合性担保の役割も果たします。
3. 実装・解決策:現場で使い分けるインデックス作成
実務では、既に運用されているテーブルに対してインデックスを追加することが多いはずです。その際は、実行計画(EXPLAIN)を確認し、本当にそのカラムが検索条件(WHERE句)や結合条件(JOIN)に使われているかを精査しましょう。
4. サンプルプログラム:インデックス作成の実践コード
以下に、実務で頻出するコマンドをまとめました。
— 1. 検索速度向上のための通常インデックス作成
— テーブル作成後、後から追加するパターン
CREATE INDEX idx_user_name ON users(name);
— 2. 重複を許さないユニークインデックス作成
— メールアドレスなど、一意性が保証されるべきカラムに使用
CREATE UNIQUE INDEX idx_user_email ON users(email);
— 3. ALTER TABLEを使用したインデックス作成
— テーブル構造変更と合わせて行う場合に適しています
ALTER TABLE users ADD INDEX idx_created_at (created_at);
— 4. 複数カラムインデックス(複合インデックス)
— 複合条件での検索が多い場合に非常に強力です
CREATE INDEX idx_name_age ON users(name, age);
— 5. インデックスの状態を確認する(必須コマンド)
— 作成したインデックスが有効か、Non_uniqueの値を確認します
SHOW INDEX FROM users;
5. 応用・注意点:現場で陥りやすい罠
インデックス作成において、以下の点に注意してください。
・過剰なインデックスは悪: 検索は速くなりますが、データの「挿入(INSERT)」「更新(UPDATE)」「削除(DELETE)」の速度は低下します。書き込み頻度が高いテーブルへの過剰なインデックス設定は避けましょう。
・NULLの扱い: UNIQUEインデックスであっても、NULL値は重複して格納可能です。これは多くのエンジニアが陥りやすい仕様です。「値が必ず入る」ことを保証したい場合は、NOT NULL制約とUNIQUEインデックスを併用してください。
・複合インデックスの順序: 複合インデックスは、左側のカラムから順に使用されます。`WHERE name = ‘…’ AND age = 20`のようなクエリを高速化したい場合、`name`を先頭にした複合インデックスを作成するのが鉄則です。
まずは現在の低速なクエリに対し、`EXPLAIN`コマンドを実行するところから始めてみてください。適切なインデックスは、サーバーのリソース負荷を大幅に軽減してくれます。

コメント