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 階層連携を実現

推薦する

Vueはツリーテーブルを実装する

この記事では、ツリーテーブルを実装するためのVueの具体的なコードを例として紹介します。具体的な内容...

HTML コードを書くための 30 のヒント

1. HTMLタグは常に閉じる前のページのソース コードでは、次のような記述がよく見られます。 &l...

JavaScript コードベースをよりクリーンにする 5 つの方法

目次1. 短絡や条件文の代わりにデフォルトのパラメータを使用する2. 複数の条件の処理3. スイッチ...

ドキュメントの場所の比較

<br />2 年前に PPK が投稿した素晴らしいブログ記事では、contains()...

CSS の flex と inline-flex の違いの詳細な説明

inline-flex は inline-block と同じです。内部要素用の display:fl...

Dockerレジストリイメージ同期の実装アイデア

はじめに以前は、Docker イメージは Azure のコンテナー レジストリに保存されていました。...

Expressプロジェクトファイルディレクトリの説明と詳細な機能の説明

app.js: スタートアップファイル、またはエントリファイルpackage.json: プロジェク...

MySQL データベース操作 (作成、選択、削除)

MySQL データベースの作成MySQL サービスにログインしたら、create コマンドを使用し...

CentOS 6.9 で glibc ダイナミック ライブラリをアップグレードする詳細なプロセス

glibc は、gnu によってリリースされた libc ライブラリ、つまり c ランタイム ライブ...

CocosCreator Typescriptでテトリスゲームを作る

目次1. はじめに2. 解決すべきいくつかの重要な問題3.最後に書く1. はじめに最近、Cocos ...

html.cssオーバーフローの包括的な理解

html.cssオーバーフローの包括的な理解XML/HTML コードコンテンツをクリップボードにコピ...

PrometheusとGrafanaを使用したMySQLサーバーのパフォーマンス監視の詳細な説明

概要Prometheus は、HTTP プロトコルを介してリモート マシンからデータを収集し、ローカ...

MySQL 8.0 ウィンドウ関数の紹介と概要

序文MySQL 8.0 より前は、Oracle、SQL SERVER、PostgreSQL などの他...

CSSアニメーションとSVGを組み合わせてエネルギーの流れの効果を作成する

最終的な効果は次のようになります。アニメーションは2つのステップに分かれていますランニング軌道を開発...

MySQL内部一時テーブルの具体的な使用法

目次連合テーブルの初期化ステートメントの実行連合の結果ユニオンオールグループ化十分なメモリステートメ...