Mysql Explainコマンドの使用と分析

Mysql Explainコマンドの使用と分析

mysql explain コマンドは、MySQL がインデックスを使用して選択ステートメントを処理し、テーブルを結合する方法を示すために使用されます。このコマンドを使用すると、クエリ ステートメントまたはテーブル構造のパフォーマンス ボトルネックを分析し、パフォーマンスを向上させる SQL ステートメントを作成できます。expalin コマンドを使用すると、次の情報を取得できます。

  • 1. 表の読み順
  • 2. テーブル読み取り操作の操作タイプ
  • 3. どのインデックスを使用できますか?
  • 4. 実際に使用されているインデックスはどれですか?
  • 5. テーブル間の参照
  • 6. オプティマイザーによってクエリされる各テーブルの行数はいくつですか?

explain を使用するには、次のように、select ステートメントの前に explain を追加するだけです。

select * form codetc の説明。

次のような結果が得られます。

以下では、結果の説明列について簡単に説明します。

id: ステートメントの実行順序識別子。

  • select_type: SELECT タイプ。次のいずれかになります。
  • シンプル -- サブクエリとユニオンがないことを意味します
  • サブクエリ --サブクエリ
  • 派生 --一時テーブル
  • 連合
  • 結合結果 --結果の結合

実際の開発では、サブクエリはできる限り使用せず、結合を使用してサブクエリを完了する必要があります。

table : このデータ行がどのテーブルに関するものか、つまりテーブル名を表示します。

type : これは重要な列であり、使用されている接続のタイプを示します。結合タイプは、最良から最悪の順に、const、eq_reg、ref、range、indexhe、および ALL です。

possible_keys : このテーブルに適用できる可能性のあるインデックスを表示します。空の場合、インデックスは作成できません。関連するフィールドの WHERE 句から適切なステートメントを選択できます。

key : 実際に使用されるインデックス。 NULL の場合、インデックスは使用されません。まれに、MYSQL が最適化されていないインデックスを選択することがあります。この場合、SELECT ステートメントで USE INDEX (indexname) を使用してインデックスの使用を強制したり、IGNORE INDEX (indexname) を使用して MySQL にインデックスを無視するように強制したりできます。

key_len : 使用するインデックスの長さ。長さが短いほど、精度を失わずに良くなります。

ref : インデックスのどの列が使用されているかを示します。可能な場合は定数を示します。

行数: 要求されたデータを返すために MYSQL がチェックする必要があると見なす行数。

追加: MYSQL がクエリを解析する方法に関する追加情報。これについては表 4.3 で説明しますが、ここで見られる悪い例は、temporary の使用と filesort の使用です。これは、MYSQL がインデックスをまったく使用できないため、取得が遅くなることを意味します。

追加列に返される説明の意味

Distinct : MYSQL は結合内の行と一致する行を見つけると、それ以上検索しません。

存在しない: MYSQL は LEFT JOIN を最適化し、LEFT JOIN 基準に一致する行が見つかると、それ以上検索を行いません。

各レコードの範囲がチェックされました(インデックス マップ: #): 理想的なインデックスが見つからなかったため、前のテーブルの各行の組み合わせに対して、MYSQL は使用するインデックスをチェックし、それを使用してテーブルから行を返します。これは、インデックスを使用する接続の中で最も遅いものの 1 つです。

filesort の使用: これが表示される場合は、クエリを最適化する必要があります。 MYSQL は、返される行をどのように順序付けるかを検出するために追加の手順を実行する必要があります。結合タイプに基づいてすべての行をソートし、条件に一致するすべての行のソートキー値と行ポインターを保存します。

インデックスの使用: 列データは、実際に読み取ることなく、インデックスの情報のみを使用してテーブルから返されます。これは、テーブルに対して要求されたすべての列が同じインデックスの一部である場合に発生します。

temporary の使用: これが表示される場合は、クエリを最適化する必要があります。ここで、MYSQL は結果を格納するための一時テーブルを作成する必要があります。これは通常、GROUP BY ではなく、異なる列セットに対して ORDER BY が実行されたときに発生します。

使用場所: WHERE 句は、次のテーブルと一致する行やユーザーに返される行を制限するために使用されます。これは、テーブル内のすべての行を返す必要がなく、結合タイプが ALL またはインデックスの場合、またはクエリに問題がある場合に発生する可能性があります。さまざまな結合タイプの説明 (効率の順に並べ替え)

system : テーブルにはシステム テーブルという 1 つの行のみが含まれます。これは const 接続タイプの特殊なケースです。

const : このクエリに一致するテーブル内のレコードの最大値 (インデックスは主キーまたは一意のインデックスにすることができます)。行が 1 つしかないため、この値は実際には定数です。これは、MYSQL が最初に値を読み取ってから定数として扱うためです。

eq_ref : 接続時に、MYSQL はクエリ時に各レコード結合の前のテーブルからレコードを読み取ります。クエリがインデックスを主キーまたは一意キーとして使用する場合に使用されます。

ref : この結合タイプは、クエリが一意キーでも主キーでもないキー、またはこれらのタイプのいずれかの一部 (たとえば、左端のプレフィックスを使用) を使用する場合にのみ発生します。前のテーブルとの各行の結合ごとに、すべてのレコードがテーブルから読み取られます。このタイプは、インデックスと一致するレコードの数に大きく依存します。少ないほど良いです。

range : この結合タイプは、インデックスを使用して行の範囲を返します。たとえば、何かを検索するために > または < を使用した場合などです。

インデックス: この結合タイプは、前のテーブル内のすべてのレコードの完全スキャンを実行します (インデックスは通常、テーブル データよりも小さいため、ALL よりも優れています)。

ALL : この結合タイプは、前のレコードと組み合わせて各レコードの完全スキャンを実行しますが、これは一般的に好ましくないため、避けるべきです。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQL のパフォーマンス分析と使用方法の説明
  • mysql explain(分析インデックス)の使い方の詳しい説明
  • MySql で SQL 実行プランをクエリするために explain を使用する方法
  • MySQL は低速クエリを可能にします (EXPLAIN SQL ステートメントの使用の概要)
  • mysql explain の使用法 (クエリ ステートメントを最適化するために explain を使用する)
  • MySQL 最適化ツールである explain の使い方の紹介
  • MySQL パフォーマンス最適化のための魔法のツール、Explain の基本的な使用分析
  • MySQL 実験: explain を使用してインデックスの傾向を分析する
  • MySQLの詳細な説明Explain
  • MySQL で explain ステートメントを使用する基本的なチュートリアル

<<:  web.config (IIS) および .htaccess (Apache) の構成

>>:  JavaScript ベースで年・月・日の 3 階層連携を実現

推薦する

MySQL 5.7 における部分テーブルのデュアルマスター同期の実装プロセスの詳細な説明

序文最近、私はある要件に遭遇しました。会社の業務上、2 つのデータベース間の一部のテーブルは、リアル...

XHTML 入門チュートリアル: フレーム タグの使用

<br />フレーム構造により、ブラウザの 1 ページに複数の Web ページを同時に表...

HTML の大なり、小なり、スペース、引用符などでよく使用されるエスケープ コードのリスト。

表は以下のとおりです。 HTMLソースコード結果を表示説明する&lt; <未満記号また...

XAML でボタンを円として再描画する方法

XAML レイアウトを使用する場合、インターフェイスを Metro 風にするために、一部のボタンでは...

CSS スキル コレクション - 古典の中の古典

リンク上の点線のボックスを削除しますコードをコピーコードは次のとおりです。 a:アクティブ、a:フォ...

Navicat Premier の MySQL へのリモート接続エラー 10038 の解決方法

MySQL へのリモート接続が失敗する場合は、次の理由が考えられます。 1. 若い男性/女性の方は、...

シンプルなウェブ計算機を実装するJavaScript

背景私は新しいプロジェクト チームに配属されたので、プロジェクトでは js を使用する必要があります...

HTMLセマンティクスと関連するフロントエンドフレームワークの詳細な分析

セマンティクスについて意味論は、記号やシンボルとそれらが表す意味との関係を研究する学問です。言語学で...

iframe に関するいくつかの発見と考察

この物語は、今日の予期せぬ発見から始まります。同社には複数のウェブサイトがある。友達リンクにはお互い...

Zen Coding 簡単で素早いHTMLの書き方

禅コーディングテキストエディタプラグインです。 Zen Coding を使用するテキスト エディター...

CSS で高さが不明な垂直中央揃えを実装する

この記事では主に、高さが不明な垂直方向の中央揃えを CSS で実装する方法を紹介し、皆さんと共有しま...

デザインにおけるユーザーエクスペリエンスの背後にある8つのユーザー本能について話す

編集者注: この記事は、Teambition チームの @娄昊川 が寄稿したものです。Teambit...

VueでTypeScriptを使用する方法

導入近年、TypeScript を求める声がますます高まり、TypeScript はフロントエンドに...

sql_mode を変更する際の MySQL エラーの解決方法

目次ERR 1067による殺人事件2番目の問題の原因はsql_modeです3. sql_modeを設...

WIN2008 サーバーのコマンド ラインを使用して IIS7 コンポーネントをインストールおよびアンインストールする方法

注意: .NET FrameWork はコア モードで実行できないため、コア インストール モードの...