元ドキュメント: EXPLAIN 文
EXPLAIN 文
概要
EXPLAIN 文は、SQL クエリの実行計画を確認するための重要なツールです。クエリオプティマイザがどのようにクエリを実行するかを事前に把握することで、パフォーマンスのボトルネックを特定し、最適化の方向性を決定できます。
TDSQL Boundless では、MySQL 互換の EXPLAIN 構文に加えて、分散環境に特有の実行計画情報を確認できます。
基本的な使い方
sql
-- 基本構文
EXPLAIN SELECT * FROM users WHERE user_id = 1001;
-- 拡張フォーマット
EXPLAIN FORMAT=TREE SELECT * FROM users WHERE user_id = 1001;
-- JSON フォーマット(詳細情報)
EXPLAIN FORMAT=JSON SELECT * FROM users WHERE user_id = 1001;出力カラムの説明
EXPLAIN の出力には以下のカラムが含まれます。
| カラム | 説明 |
|---|---|
| id | SELECT の識別番号。サブクエリや UNION がある場合、複数のIDが表示される |
| select_type | SELECT の種類(SIMPLE、PRIMARY、SUBQUERY、DERIVED など) |
| table | 参照先のテーブル名 |
| partitions | 参照先のパーティション |
| type | 結合方式。パフォーマンスに大きく影響する重要な指標 |
| possible_keys | 使用可能なインデックスの候補 |
| key | 実際に使用されるインデックス |
| key_len | 使用されるインデックスの長さ(バイト数) |
| ref | インデックスとの比較対象のカラムまたは定数 |
| rows | 検査される推定行数 |
| filtered | テーブル条件によってフィルタされる行の割合(%) |
| Extra | 追加情報(Using index、Using where、Using filesort など) |
type カラムの詳細
type カラムは、テーブルへのアクセス方式を示します。パフォーマンスの良い順に以下の通りです。
| type | 説明 | 性能 |
|---|---|---|
| system | テーブルに1行のみ(システムテーブル) | 最良 |
| const | 主キーまたはユニークインデックスによる定数検索 | 非常に高速 |
| eq_ref | 結合時に主キーまたはユニークインデックスを使用 | 高速 |
| ref | 非ユニークインデックスによる検索 | 良好 |
| range | インデックスの範囲スキャン | 許容範囲 |
| index | インデックスのフルスキャン | 要注意 |
| ALL | テーブルフルスキャン | 要改善 |
Extra カラムの重要な値
| 値 | 説明 | 注意点 |
|---|---|---|
| Using index | カバリングインデックスが使用されている | 良好な状態 |
| Using where | WHERE 句でフィルタリングが行われている | 通常は問題なし |
| Using temporary | 一時テーブルが使用されている | 改善を検討 |
| Using filesort | ファイルソートが使用されている | 改善を検討 |
| Using index condition | インデックスコンディションプッシュダウンが使用されている | 良好な状態 |
分散環境での EXPLAIN の注意点
TDSQL Boundless の分散環境では、EXPLAIN の出力に以下の特有の情報が含まれる場合があります。
クロスノードクエリの確認
分散環境では、クエリが複数のノードにまたがる場合があります。EXPLAIN を使用して、クエリがシングルノードで完結するか、クロスノードアクセスが必要かを確認することが重要です。
分散結合の実行計画
JOIN を含むクエリでは、結合対象のデータが同一ノードに存在するかどうかによって実行計画が大きく異なります。
sql
-- シャードキーを使用した結合(効率的)
EXPLAIN SELECT o.*, u.name
FROM orders o
JOIN users u ON o.user_id = u.user_id
WHERE o.user_id = 1001;
-- シャードキー以外での結合(クロスノードアクセスの可能性)
EXPLAIN SELECT o.*, p.name
FROM orders o
JOIN products p ON o.product_id = p.product_id;分散環境での最適化ポイント
- シャードキーを WHERE 句に含める — シングルノードクエリに絞り込む
- 不要なクロスノード結合を避ける — テーブル設計でデータアフィニティを考慮する
- EXPLAIN FORMAT=JSON を活用する — 詳細なコスト情報を確認する
実践的な分析例
例1:フルテーブルスキャンの改善
sql
-- 改善前(type: ALL)
EXPLAIN SELECT * FROM orders WHERE order_date > '2026-01-01';
-- インデックスの追加
CREATE INDEX idx_order_date ON orders(order_date);
-- 改善後(type: range)
EXPLAIN SELECT * FROM orders WHERE order_date > '2026-01-01';例2:Using filesort の改善
sql
-- 改善前(Extra: Using filesort)
EXPLAIN SELECT * FROM users ORDER BY created_at LIMIT 100;
-- インデックスの追加
CREATE INDEX idx_created_at ON users(created_at);
-- 改善後(Extra: Using index)
EXPLAIN SELECT * FROM users ORDER BY created_at LIMIT 100;まとめ
EXPLAIN 文は、クエリのパフォーマンス分析における基本ツールです。type カラムと Extra カラムの値を正しく読み取り、適切なインデックス設計やクエリの書き換えにつなげてください。分散環境では、クロスノードアクセスの有無にも注意が必要です。
詳細な仕様については、元ドキュメントをご参照ください。