導入
データベースのパフォーマンスチューニングにおいて、インデックスの最適化は避けて通れない工程です。しかし、運用が長くなると「どのカラムにインデックスが貼られているか」「重複や不要なインデックスはないか」を把握するのが困難になります。本稿では、MySQLでインデックス情報を正確に取得する2つの手法を解説し、現場でのトラブルシューティングを効率化する方法を伝授します。
基礎知識
MySQLのインデックス情報は、メタデータとしてシステムデータベースである INFORMATION_SCHEMA に格納されています。特に STATISTICS テーブルは、インデックスの構成やカーディナリティ(値の分散度合い)を調査する際に最も重要なリソースです。また、これらをコマンドラインから簡便に呼び出す手段として SHOW INDEX 構文が用意されています。これらを使い分けることで、単なる確認から大規模なインデックスの棚卸しまで柔軟に対応が可能となります。
実装/解決策
インデックス調査には大きく分けて「簡易確認」と「メタデータ抽出」の2つのアプローチがあります。
1. SHOW INDEX文:個別のテーブル構成を直感的に確認したい場合に適しています。実行結果が表形式(または\Gによるリスト形式)で出力されるため、開発中のデバッグに最適です。
2. INFORMATION_SCHEMA.STATISTICS:複数のテーブルを跨いだ調査や、特定の条件(例:特定のカラムに関連する全インデックスの抽出など)でフィルタリングを行いたい場合に適しています。
サンプルプログラム
以下のコードは、実務でよく利用する調査用クエリです。ご自身の環境に合わせてデータベース名を変更して実行してください。
— 1. SHOW INDEXを利用した特定のテーブルのインデックス確認
— 開発中のテーブル構造確認に最適です
SHOW INDEX FROM users\G
— 2. INFORMATION_SCHEMAを利用した網羅的な調査
— 特定のスキーマ内の全インデックスを一覧表示します
SELECT
TABLE_NAME,
INDEX_NAME,
COLUMN_NAME,
SEQ_IN_INDEX, — 複合インデックスの順序を確認可能
NON_UNIQUE — 0ならユニークインデックス
FROM
INFORMATION_SCHEMA.STATISTICS
WHERE
TABLE_SCHEMA = ‘あなたのデータベース名’;
— 3. 応用:インデックスのカーディナリティを確認する
— 統計情報の偏りを確認し、実行計画が最適かどうかを判断する材料にします
SELECT
TABLE_NAME,
INDEX_NAME,
CARDINALITY
FROM
INFORMATION_SCHEMA.STATISTICS
WHERE
TABLE_SCHEMA = ‘あなたのデータベース名’;
応用・注意点
現場で注意すべきは、CARDINALITY(カーディナリティ)の正確性です。この値は統計情報に基づいて計算されており、テーブルの更新頻度によっては最新の値とは限りません。もし実行計画が不適切だと感じたら、まずは ANALYZE TABLE テーブル名; を実行して統計情報を更新することを推奨します。
また、大規模なデータベースで INFORMATION_SCHEMA を全件スキャンすると、システムへの負荷が高まる場合があります。本番環境で調査を行う際は、必ず WHERE 句でテーブルやスキーマを適切に絞り込み、低負荷なタイミングで実施するように心がけてください。

コメント