MYSQL パフォーマンス アナライザー EXPLAIN 使用例分析

MYSQL パフォーマンス アナライザー EXPLAIN 使用例分析

この記事では、例を使用して MYSQL パフォーマンス アナライザー EXPLAIN の使用方法を説明します。ご参考までに、詳細は以下の通りです。

方向:

EXPLAIN SELECT * FROM ユーザー;

環境とデータの準備

-- MySQL のバージョンを確認します SELECT VERSION();
 
-- MySQL はどのようなストレージ エンジンを提供していますか? SHOW ENGINES;
 
-- デフォルトのストレージ エンジンを表示します。SHOW VARIABLES LIKE '%storage_engine%';

出力:

id: 出力は、SQL 全体の実行順序を識別するために使用される整数です。 id が同じ場合、異なる id を持つ行は上から下に実行されます。id 値が大きいほど実行優先度が高くなり、行が最初に実行されます。行が他の行の結合結果を参照する場合、値は NULL になることがあります。

select_type:[クエリタイプ]

SIMPLE: 単純な SELECT クエリ、UNION またはサブクエリなし、単一テーブル クエリまたは複数テーブル JOIN クエリを含む

PRIMARY: 最も外側の選択クエリ。サブクエリや UNION クエリでよく使用されます。最も外側のクエリは PRIMARY としてマークされます。

UNION: UNION 操作の 2 番目以降の SELECT は、外部クエリの結果セットに依存しません (外部クエリは PRIMARY に対応する SELECT を参照します)

DEPENDENT UNION: UNION 操作の 2 番目以降の SELECT は、外部クエリの結果セットに依存します。

UNION RESULT: UNION の結果 (UNION ALL の場合は結果なし)

SUBQUERY: サブクエリ内の最初のSELECTクエリ。外部クエリの結果セットに依存しません。

依存サブクエリ: サブクエリ内の最初の選択クエリは、外部クエリの結果に依存します。

DERIVED: 派生テーブル (一時テーブル)。FROM 句にサブクエリがある場合によく使用されます。

: MySQL 5.7 には派生テーブルの新機能があり、条件を満たす派生テーブル内の子テーブルを親クエリテーブルに直接結合できるため、実行プランが簡素化され、実行効率が向上します。この機能は MySQL 5.7 でデフォルトで有効になっているため、デフォルトでは上記の SQL の実行プランは次のようになります。

MATERIALIZED: マテリアライズド サブクエリは、MySQL 5.6 で導入された新しい select_type で、主に FROM 句または IN 句のサブクエリを最適化するために使用されます。詳細については、「マテリアライズドによるサブクエリの最適化」を参照してください。

キャッシュ不可能なサブクエリ: 外部メイン テーブルの場合、サブクエリをキャッシュできないため、毎回計算する必要があります。

UNCACHEABLE UNION: UNCACHEABLE SUBQUERY に似ていますが、UNION 操作で使用されます。

SIMPLLE、PRIMARY、SUBQUERY、DERIVED 実際の業務ではこの 4 つによく遭遇します。この 4 つを理解しておいてください。他のものについては、遭遇したときに調べてください。

テーブル: 対応する行がどのテーブルにアクセスしているかを示します (エイリアスがある場合は表示されます)。また、<union2,3>、<subquery2>、<derived2> などの類似した値があります (2,3、2、2 は id 列の値を参照します)

パーティション: クエリが一致するパーティション。パーティション化されていないテーブルの場合、この値は NULL になります。ほとんどの場合、パーティションは使用されないので、この列に注意を払う必要はありません。

タイプ:

結合タイプまたはアクセスタイプは、MySQL がテーブル内の条件を満たす行をどのように見つけるかを指定します。これは、クエリが効率的かどうかを判断するための重要な基準です。完全な概要については、explain-join-types を参照してください。

システム: このテーブルには1行のみ(=システムテーブル)があり、これはconst型の特殊なケースです。

const: 一致する行が 1 つしかないと判断された場合、MySQL オプティマイザはクエリの前にそれを読み取り、1 回だけ読み取るため、非常に高速になります。主キーまたは一意のインデックス内の定数値の比較に使用されます

eq_ref: 前のテーブルの各行に対して、このテーブルから最大 1 つの条件に該当するレコードが返されます。これは、接続で使用されるインデックスが PRIMARY KEY または UNIQUE NOT NULL インデックスである場合に非常に効率的です。

ref: インデックス アクセス (インデックス ルックアップとも呼ばれます) は、単一の値に一致するすべての行を返します。このタイプは、通常、複数テーブルのJOINクエリ、非UNIQUEまたは非PRIMARY KEY、または左端のプレフィックスルールインデックスを使用するクエリで使用されます。つまり、JOINがキーワードに基づいて1行を選択できない場合は、refを使用します。

fulltext: これは、フルテキスト インデックスが使用される場合に使用されます。このタイプのインデックスは通常は使用されず、専用の検索サービス (solr、elasticsearch など) に置き換えられます。

ref_or_null: refに似ていますが、NULLを具体的に検索できる行を追加します。

これは、武器列にインデックスがあり、武器列に NULL があるという前提条件に従います。

index_merge: このアクセスタイプはインデックスマージ最適化メソッドを使用します

これも条件付きです。id 列と weapon 列の両方に単一列のインデックスがあります。 index_merge が発生し、このタイプの SQL が後で頻繁に使用される場合は、単一列インデックスをより効率的な複合インデックスに置き換えることを検討できます。

unique_subquery: 2 つのテーブル結合における駆動テーブルの eq_ref アクセス メソッドと同様に、unique_subquery は IN サブクエリを含む一部のクエリ ステートメントで使用されます。クエリ オプティマイザーが IN サブクエリを EXISTS サブクエリに変換することを決定し、サブクエリが等価値の一致に主キーまたは一意のインデックスを使用できる場合は、unique_subquery が使用されます。

index_subquery: index_subquery は unique_subquery と似ていますが、サブクエリ内のテーブルにアクセスするために通常のインデックスが使用される点が異なります。

range: インデックスを使用して、指定された範囲内の行を取得します。=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN、または IN 演算子を使用し、キーワード列を定数と比較する場合は、range が使用されます。前提として、インデックスに基づいている必要があります。つまり、id にインデックスが必要です。

インデックス: インデックス カバレッジを使用できるが、すべてのインデックス レコードをスキャンする必要がある場合は、インデックスを使用します。これは、統計を行うときに非常に一般的です。

ALL: おなじみのフルテーブルスキャン

possible_keys: この SQL で使用できるインデックスを示しますが、クエリ中に必ずしも使用されるわけではありません。空の場合は、使用できるインデックスがないことを意味します。この場合、WHERE ステートメントをチェックして、特定の列を参照できるか確認するか、新しいインデックスを作成してパフォーマンスを向上させることができます。

key: この SQL で実際に使用されているインデックスを表示します。インデックスが選択されていない場合、この列は null になります。MySQL で possible_keys 列のインデックスを使用または無視するように強制するには、クエリで FORCE INDEX、USE INDEX、または I GNORE INDEX を使用します。

key_len: MySQL が使用することを決定したキーの長さ (バイト単位) を表示します。キーが NULL の場合、長さは NULL になります。長さが短いほど、精度を失わずに良くなります。

ref: 定数や列など、インデックス列が何と同等であるかを示します。列の名前 (または定数) が表示されます。多くの場合、これは Null です。

行数: この SQL を実行するときに MySQL パーサーがスキャンされると予測する行数を示します。この値は推定値であり、特定の値ではなく、通常は実際の値よりも小さくなります。

フィルター: 返される行数と読み取る必要のある行数 (行の値) の比率を表示します。もちろん、小さいほど良いです。

余分な:

他の列にはないが重要な追加情報を示します。可能な値は多数あります。一般的な値をいくつか見てみましょう。

インデックスの使用: SQL がテーブルに戻ってデータをクエリするのではなく、カバーリング インデックスを使用することを示します。これにより、パフォーマンスが非常に向上します。

where: を使用すると、ストレージ エンジンはレコードの検索後に事後フィルタリングを実行することを示します。クエリがインデックスを使用できない場合、where: を使用すると、MySQL が where 条件を使用して結果セットをフィルタリングする必要があることが通知されるだけです。

一時テーブルの使用: MySQL は結果セットを保存するために一時テーブルを使用する必要があることを意味します。これはクエリの並べ替えやグループ化でよく使用されます。

ファイルソートの使用: MySQL がインデックスを使用して直接ソートできない (ソートされたフィールドがインデックス フィールドではない) こと、およびソートにバッファ スペース (メモリまたはディスク) が使用されることを示します。通常、この値は SQL を最適化する必要があることを示し、CPU を大量に消費します。

不可能な場合: この追加情報は、クエリステートメントの WHERE 句が常に FALSE の場合に表示されます。

もちろん、一般的ではないものもあります。遭遇した際にはぜひチェックしてください!!!

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL トランザクション操作スキル」、「MySQL ストアド プロシージャ スキル」、「MySQL データベース ロック関連スキルの概要」、および「MySQL 共通関数の概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化
  • MySQL は低速クエリを可能にします (EXPLAIN SQL ステートメントの使用の概要)
  • mysql explain の使用法 (クエリ ステートメントを最適化するために explain を使用する)
  • MysqlチューニングExplainツールの詳細な説明と実践的な演習(推奨)
  • MySQLの詳細な分析で使用法と結果を説明します
  • MySQLのexplain型の詳細な説明
  • Explainキーワードに基づいてMySQLインデックス機能を最適化する方法
  • MySQL での実行計画の詳細分析
  • MySQL インデックス最適化の説明
  • EXPLAIN を使って MySQL の SQL 実行プランを分析する方法
  • MySQL EXPLAIN ステートメントの使用例

<<:  Nexus をベースに Alibaba Cloud プロキシ ウェアハウスを構成するプロセスの分析

>>:  JavaScript の継承についてどれくらい知っていますか?

推薦する

docker のインストールが完了し、bridge-nf-call-iptables が無効であると報告される問題を解決します

Centos マシンで docker のインストールが完了したら、docker info コマンドを...

Vue で $attrs と $listeners を使用するチュートリアル

目次導入例要約する導入$属性すべての親コンポーネントのプロパティを継承します (props を通じて...

Linux で MySQL 5.7.19 をアンインストールする方法

1. MySQLが以前にインストールされていたかどうかを確認するコマンド: rpm -qa|grep...

VMware Esxi のルート パスワードを忘れた後に正常に取得する方法

CentOS6 インストール ディスク (任意のバージョン) を準備するか、別の pnux インスト...

Vueコンポーネント通信のさまざまな方法の詳細な説明

目次1. 父から息子へ2. 息子から父へ3. 親子関係のないコンポーネントの値の転送4. ヴュークス...

要素に丸い境界線を追加する border-radius メソッド

border-radius:10px; /* すべての角は半径 10px で丸められます*/ bor...

CentOS 8にdockerをインストールする最も詳細な方法

CentOS 8にDockerをインストールする公式ドキュメント: https://docs.doc...

JavaScript キャンバスで 9 マスのグリッドカットの効果を実現

この記事では、9グリッドカット効果を実現するためのキャンバスの具体的なコードを紹介します。具体的な内...

Docker で MySQL マスター スレーブ レプリケーションを実装するためのサンプル コード

目次1. 概要1. 原則2. 実装3. スレーブインスタンスを作成する4. マスタースレーブ構成要約...

Vue.js プロジェクトの開始方法

目次1. Node.jsとVue 2. ローカル開発環境でフロントエンドのVueプロジェクトを実行す...

Eclipse は Tomcat を構成しますが、Tomcat には無効なポート解決策があります

目次1. EclipseがTomcatを構成する2. Tomcat の無効なポートの解決方法方法1:...

ネイティブJSを使用した遅延読み込みlazyLoadの3つの方法の概要

目次序文方法1: 高コントラスト方法2: getBoundingClientRect() APIを使...

CentOS 6.4 MySQL 5.7.18 のインストールと設定方法のグラフィックチュートリアル

Centos6.4 で mysql5.7.18 をインストールするための具体的な手順が全員に共有され...

Vue で @person 関数を実装する方法

この記事ではvueを使用し、マウスクリックイベントといくつかの小さなページの最適化を追加します。 基...

Oracle を MySQL に置き換える際の問題と解決策

目次移行ツールアプリケーション変換mysql8.0 ドライバ パッケージを追加データソース構成の変更...