MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  EXPLAIN によるクエリーの最適化

8.8.1 EXPLAIN によるクエリーの最適化

EXPLAIN ステートメントは、MySQL がステートメントをどのように実行するかに関する情報を提供します。

  • EXPLAIN は、SELECT, DELETE, INSERT, REPLACE および UPDATE ステートメントで動作します。

  • 説明可能なステートメントで EXPLAIN を使用すると、MySQL は、オプティマイザからのステートメント実行プランに関する情報を表示します。 つまり、MySQL はテーブルがどのように、どんな順番で結合されているかに関する情報を含む、ステートメントを処理する方法を説明します。 EXPLAIN を使用して、実行プラン情報を取得することについては、セクション8.8.2「EXPLAIN 出力フォーマット」を参照してください。

  • EXPLAIN を説明可能なステートメントではなく FOR CONNECTION connection_id とともに使用すると、名前付き接続で実行されているステートメントの実行計画が表示されます。 セクション8.8.4「名前付き接続の実行計画情報の取得」を参照してください。

  • SELECT ステートメントの場合、EXPLAIN は、SHOW WARNINGS を使用して表示できる追加の実行計画情報を生成します。 セクション8.8.3「拡張 EXPLAIN 出力形式」を参照してください。

  • EXPLAIN は、パーティションテーブルを含むクエリーの調査に役立ちます。 セクション24.3.5「パーティションに関する情報を取得する」を参照してください。

  • FORMAT オプションを使用して、出力形式を選択できます。 TRADITIONAL は表形式で出力を表示します。 FORMAT オプションが存在しない場合、これはデフォルトです。 JSON フォーマットは JSON フォーマットで情報を表示します。

EXPLAIN によって、インデックスを使用して行を見つけることで、ステートメントが高速に実行されるように、テーブルにインデックスを追加するべき場所がわかります。 また、EXPLAIN を使用して、オプティマイザがテーブルを最適な順序で結合しているかどうかを確認することもできます。 SELECT ステートメントでテーブルが指定されている順序に対応する結合順序を使用するように、オプティマイザにヒントを提供するには、ステートメントを SELECT だけでなく、SELECT STRAIGHT_JOIN で始めます。 (セクション13.2.10「SELECT ステートメント」を参照してください。) ただし、準結合変換が無効になっているため、STRAIGHT_JOIN ではインデックスが使用されない場合があります。 セクション8.2.2.1「準結合変換による IN および EXISTS サブクエリー述語の最適化」を参照してください。

オプティマイザトレースは、EXPLAIN のトレースを補完する情報を提供する場合があります。 ただし、オプティマイザのトレース形式と内容はバージョン間で変更される可能性があります。 詳細については、「MySQL Internals: Tracing the Optimizer」を参照してください。

インデックスが使われるはずであると思うタイミングでそれらが使われていない問題がある場合、ANALYZE TABLE を実行して、オプティマイザが行う選択に影響する可能性があるキーのカーディナリティーなどのテーブル統計を更新します。 セクション13.7.3.1「ANALYZE TABLE ステートメント」を参照してください。

注記

EXPLAIN はテーブル内のカラムに関する情報を取得するためにも使用できます。 EXPLAIN tbl_nameDESCRIBE tbl_name および SHOW COLUMNS FROM tbl_name と同義です。 詳細については、セクション13.8.1「DESCRIBE ステートメント」およびセクション13.7.7.5「SHOW COLUMNS ステートメント」を参照してください。


関連キーワード:  テーブル, ステートメント, インデックス, EXPLAIN, InnoDB, 情報, 結合, 実行, クエリー, 参照