目次
1. MySQLのインデックスとは:データベースパフォーマンス向上の鍵
MySQLデータベースでインデックスを効果的に使用することで、クエリのパフォーマンスを大幅に向上させることができます。インデックスとは、データベースの特定の列(カラム)に対して生成されるデータ構造で、検索やフィルタリングの速度を向上させる役割を持ちます。例えば、大量のデータから特定の情報を抽出する際、インデックスを使用することで全データの走査を省略し、インデックス内の指定カラムだけを検索します。インデックスの役割と種類
MySQLのインデックスには、以下の種類があります。- PRIMARY(プライマリーキー):テーブルごとに1つのみ許される一意のキーで、テーブルの主な識別子として利用されます。
- UNIQUEインデックス:一意性を保つインデックスで、指定カラムに重複した値が挿入されることを防ぎます。
- 一般インデックス:一意性の制約はなく、特定のカラムの検索効率を上げるために用いられるインデックス。
2. MySQLでインデックスを確認する基本方法
MySQLでは、作成済みのインデックスを確認するためにSHOW INDEXコマンドを使用します。これは簡単なSQLコマンドであり、指定したテーブル内のインデックス情報を表示します。以下で具体的な手順を紹介します。SHOW INDEXの基本構文と出力内容
SHOW INDEX FROM テーブル名;
出力内容の解説
このコマンドを実行すると、以下のような情報が表示されます。- Table:インデックスが存在するテーブル名
- Non_unique:インデックスが一意(0)か、重複を許可するか(1)を示します
- Key_name:インデックスの名前
- Column_name:インデックスが適用されているカラム名
- Cardinality:インデックスに登録されている一意な値の見積もり。検索の効率を示す指標として利用されます。

3. INFORMATION_SCHEMA.STATISTICSテーブルでのインデックス確認
SHOW INDEX文以外にも、MySQLではINFORMATION_SCHEMA.STATISTICSテーブルを参照してインデックスを確認する方法があります。これは、データベース全体のインデックスをリストするために便利で、さらに詳細な情報を取得することができます。INFORMATION_SCHEMA.STATISTICSの基本クエリ
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'データベース名';
クエリ結果の詳細
- TABLE_SCHEMA:インデックスが所属するデータベース名
- TABLE_NAME:インデックスが存在するテーブル名
- COLUMN_NAME:インデックスが適用されているカラム名
- INDEX_NAME:インデックスの名前
4. インデックスの追加・削除方法とその影響
インデックスの追加方法
インデックスは、必要に応じて後から追加することができます。以下のコマンドを使用して、指定のカラムにインデックスを作成します。CREATE INDEX インデックス名 ON テーブル名(カラム名);
例えば、users
テーブルのemail
カラムにインデックスを追加したい場合、以下のように実行します:CREATE INDEX idx_email ON users(email);
インデックスの削除方法
不要なインデックスは削除して、INSERTやUPDATE操作のパフォーマンスを最適化できます。削除にはDROP INDEXコマンドを使用します。DROP INDEX インデックス名 ON テーブル名;
不要なインデックスの例としては、検索条件(WHERE句)に利用されないカラムに設定されたインデックスなどがあります。インデックスを削除することでデータの挿入や更新速度を向上させることが可能です。
5. EXPLAIN文を使ってインデックスのパフォーマンス確認
MySQLのEXPLAIN文は、クエリ実行計画を確認し、どのインデックスが適用されているかを調査するのに有用です。これにより、インデックスの有効性を評価し、必要に応じて最適化を図ることができます。EXPLAIN文の基本的な使い方
EXPLAIN SELECT * FROM テーブル名 WHERE カラム名 = '条件';
このコマンドを使用すると、インデックスが使用されているか、全行走査が行われているかが確認できます。結果には以下の項目が含まれます:- type:クエリの種類(ALLは全行走査、INDEXはインデックスが使用されている)
- possible_keys:クエリに対して使用可能なインデックスのリスト
- key:実際に使用されるインデックス名
- rows:走査される推定行数