MySQL explain クエリ命令情報の取得原理と例

MySQL explain クエリ命令情報の取得原理と例

explain はクエリ実行プラン情報を取得するために使用されます。

1. 文法

次のように、select の前に explain を追加するだけです。

mysql> 説明 1 を選択します。
+----+-------------+--------+-----------+--------+---------------+-------+-------+-------+---------+----------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+--------+-----------+--------+---------------+-------+-------+-------+---------+----------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | テーブルは使用されません |
+----+-------------+--------+-----------+--------+---------------+-------+-------+-------+---------+----------------+

2. 説明の情報

1. id: SELECT が属する行を示します。 idが大きいほど実行順序が高くなります。idが同じ場合は上から下の順に実行されます。

2. select_type: 対応する行が単純なクエリか複雑なクエリかを表示します。

1) SIMPLE: シンプルなクエリ。サブクエリとUNIONを含まないことを意味します。

2) SUBQUERY: サブクエリを示します

3) DERIVED: FORM句に含まれるサブクエリのSELECTを示すために使用されます。

4) ユニオン:

3. テーブル: アクセスするテーブルを示します

4. パーティション: パーティションにアクセスする

5. type: テーブル内の行を検索する方法を表す関連付けタイプ。

1) ALL: テーブル全体をスキャンします。データを見つけるには、すべてのデータを最初から最後までスキャンする必要があります(limitキーワードではすべてのデータがスキャンされません)

2) インデックス: インデックススキャン。これは、テーブルが行順ではなくインデックス順にスキャンされることを除いて、フル テーブル スキャンと同じです。主な利点は、ソートが回避されることです。最大の欠点は、テーブル全体をインデックス順に読み取るオーバーヘッドです。

3) 範囲:範囲スキャン。これは、インデックス全体を走査せずに、インデックス内の特定のポイントから開始する制限付きインデックス スキャンです。

4) ref: インデックスアクセス。単一の値に一致するすべての行を返します。これは、一意でない所有権、または一意でないプレフィックスを持つ一意の所有権を使用している場合にのみ発生します。

5) eq_ref: 主キー インデックスと一意のインデックスである場合、このインデックスを使用して検索し、最大 1 つのレコードを返します。

6) const、system: これらのアクセス タイプは、MySQL がクエリの一部を最適化し、定数に変換できる場合に使用されます。

6. possible_keys: クエリに使用できるキーを表示します

7. key: MySQL は、このテーブルへのアクセスを最適化するために使用するインデックスを決定します。このインデックスが possible_keys にない場合は、カバーするインデックスを選択することがあります。インデックスが使用されていない場合、この値は NULL になります。

8. key_len: インデックスのバイト数。短いほど良いです。一般的に、key_len はインデックス列フィールド型の長さに等しくなります。たとえば、int は 4 バイト、bigint は 8 バイト、date は 3 バイト、datetime は 8 バイトです。インデックス列が文字列型の場合、その文字セットを考慮する必要があります。utf8 の各文字は 3 つのフィールドを占有し、変数型 (varchar) はさらに 2 バイトを必要とします。インデックス列が null 可能な場合は、追加のフィールドが必要です。

9. 参照:

10. 行数: MySQLが必要な行を見つけるために読み込む必要があると推定する行数

11. フィルター: 読み取られた行数 (推定) に対する返された行数の割合。値が大きいほど、優れています。

12. 追加: 他の列に収まらない重要な情報を表示します。一般的な値は次のとおりです。

1) インデックスの使用: テーブルへのアクセスを避けるためにカバーインデックスを使用することを示します。

2) whereの使用: MySQLサーバーはストレージエンジンが行を取得した後にフィルタリングします。

3) 一時テーブルの使用: MySQL がクエリ結果をソートするときに一時テーブルを使用することを示します。

3. 例

例1:

mysql> explain select * from bd_dept;
+----+-------------+----------+-----------+--------+---------------+-----+-------+-------+------+------+------+------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+--------+---------------+-----+-------+-------+------+------+------+------+
| 1 | シンプル | bd_dept | NULL | すべて | NULL | NULL | NULL | NULL | 3 | 100.00 | NULL |
+----+-------------+----------+-----------+--------+---------------+-----+-------+-------+------+------+------+------+

この文はインデックスを使用せずにテーブル全体をスキャンしていることがわかります。

例2:

mysql> explain select * from bd_dept where id=1;
+----+-------------+----------+-----------+--------+---------------+----------+-------+-------+------+------+------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+--------+---------------+----------+-------+-------+------+------+------+
| 1 | SIMPLE | bd_dept | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |
+----+-------------+----------+-----------+--------+---------------+----------+-------+-------+------+------+------+

このステートメントは主キー インデックスを使用します。結果を取得するには、1 つのレコードをスキャンするだけで済みます。int 型は 4 バイトを占めるため、ken_len=4 になります。

例3:

mysql> explain select * from bd_dept where dept_code='01';
+----+-------------+----------+-----------+---------+---------------+------------+-------+-------+------+------+------+------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+---------+---------------+------------+-------+-------+------+------+------+------+
| 1 | SIMPLE | bd_dept | NULL | const | dept_code | dept_code | 32 | const | 1 | 100.00 | NULL |
+----+-------------+----------+-----------+---------+---------------+------------+-------+-------+------+------+------+------+

dept_code は一意のインデックス フィールドであり、フィールド タイプは varchar(10) であり、空ではないため、インデックスの長さは 10*3+2=33 になります。

例4:

mysql> explain select * from bd_dept where create_date>'2020-04-29';
+----+-------------+----------+-----------+---------+---------------+-------------+-------+-------+---------+-----------------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+-------+---------+-----------------------+
| 1 | SIMPLE | bd_dept | NULL | range | create_date | create_date | 4 | NULL | 1 | 100.00 | インデックス条件を使用 |
+----+-------------+----------+-----------+---------+---------------+-------------+-------+-------+---------+-----------------------+

create_date は日付型で、共通のインデックス フィールドであり、空にすることができます。クエリ条件はより大きいため、関連付けの種類は範囲となり、インデックスの長さは 3+1=4 になります。

例5:

mysql> explain select a.id, a.dept_name, b.dept_name parent_name from bd_dept a inner join bd_dept b on a.id=b.parent_id;
+----+-------------+---------+-----------+----------+---------------+---------+----------+-----------------------+-----------+-------------+-------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+---------+-----------+----------+---------------+---------+----------+-----------------------+-----------+-------------+-------------+
| 1 | SIMPLE | b | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | where の使用 |
| 1 | シンプル | a | NULL | eq_ref | プライマリ | プライマリ | 4 | zhi_test.b.parent_id | 1 | 100.00 | NULL |
+----+-------------+---------+-----------+----------+---------------+---------+----------+-----------------------+-----------+-------------+-------------+

MySQLは最初にテーブル全体をスキャンし、次に主キーを介して関連付けていることがわかります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL パフォーマンス最適化のための魔法のツール、Explain の基本的な使用分析
  • MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化
  • EXPLAIN を使って MySQL の SQL 実行プランを分析する方法
  • MySql で SQL 実行プランをクエリするために explain を使用する方法
  • MySQL における explain の役割の詳細な説明
  • MySQLクエリ最適化におけるExplainの詳細な分析
  • MySQL での explain の使用方法の詳細な説明
  • MySQLの概要説明

<<:  Xshellの一般的な問題と関連する設定の詳細な説明

>>:  Vue はスクロール可能なポップアップウィンドウ効果を実装します

推薦する

MySQL トリガーの基本的な使い方(作成、表示、削除など)の詳細な説明

目次1. MySQLトリガーの作成: 1. MySQLトリガー作成構文: 2. MySQL作成構文の...

HTML/CSS での空白処理とページ内の空白を保持する方法

HTML の空白ルールHTML では、コンテンツ内の複数のスペースは通常 1 つとみなされ、連続する...

mysql maxとwhere間の実行問題の概要

mysql maxとwhereの間の実行の問題SQLを実行します: テーブル「grades」を作成し...

Dockerがログファイルを保存する場所の詳細な説明

目次ログはどこに保存されますか?コンテナ内のアプリケーションからのログを表示するDockerデーモン...

WeChatミニプログラムビデオ集中砲火位置ランダム

この記事では、WeChatミニプログラムのビデオ弾幕の位置をランダム化するための具体的なコードを紹介...

MySQL 起動エラー InnoDB: ロックできません/ibdata1 エラー

OS X 環境で MySQL を起動すると、エラー メッセージが表示されます。 016-03-03T...

CSS BEM 命名標準の概要 (推奨)

1 BEM命名標準とはBem は、ブロック、要素、修飾子の略語であり、Yandex チームによって...

MySQL がデータの削除と挿入に非常に時間がかかる問題の解決策

会社の開発者がテスト環境で挿入ステートメントを実行すると、正常に実行されるまでに 10 秒以上かかり...

Vue3 ドラッグ可能な左パネルと右パネルの分割コンポーネントの実装

目次コンポーネントの分解左パネル右パネル入力パラメータの分解小道具スロット具体的な実装ドラッグする方...

Centos7でmysql6の初期化インストールパスワードをインストールする方法

1. まずデータベースサーバーを停止しますサービスmysqld停止2.vim /etc/my.cnf...

WeChatアプレットが検索ボックス機能を実装

この記事の例では、WeChatアプレットの検索ボックス機能を実装するための具体的なコードを参考までに...

JSの基本概念の詳細な紹介

目次1. JSの特徴1.1 マルチパラダイム1.2 説明1.3 シングルスレッド1.4 ノンブロッキ...

Vue3 における provide と inject の使用法と原則

序文:親コンポーネントと子コンポーネント間でデータを渡す場合、通常は props と emittin...

MySQL ステートメントにおける IN と Exists の比較分析

背景最近、SQL 文を書くときに、IN と Exists のどちらを選択するか迷ったので、両方の方法...

高可用性 Web クラスターを実装するための Keepalived+Nginx+Tomcat サンプル コード

高可用性 Web クラスターを実現する Keepalived+Nginx+Tomcat 1. Ngi...