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 はスクロール可能なポップアップウィンドウ効果を実装します

推薦する

Redo ログと Undo ログに基づく MySQL クラッシュ回復の分析

目次MySQLクラッシュ回復プロセス1. ブラックボックス下のデータフローを更新する2. やり直しロ...

WeChatアプレット仮想リストの応用例

目次序文仮想リストとは何ですか?デモ効果準備スクリーンの高さとボックスの高さ最適化要約する序文人気の...

MySQL 8.0.13 手動インストールチュートリアル

この記事では、MySQL 8.0.13の手動インストールチュートリアルを参考までに紹介します。具体的...

GobangゲームのWebバージョンを実装するためのJavaScript

この記事では、GobangゲームのWebバージョンを実装するためのJavaScriptの具体的なコー...

Hyper-V の紹介とインストールと使用 (詳細な図解)

はじめに:IT 業界の巨人である Microsoft 独自の仮想化技術は、VMware や Citr...

30分でReact Hooksを包括的に理解できます

目次概要1. 使用状態1.1 3つの概念に関する質問1.2 例1.3 注記2. リデューサーを使用す...

Vue は QR コード スキャン機能を実装します (スタイル付き)

必要: vue を使用して QR コードのスキャンを実現します。プラグイン: QRコードリーダー;プ...

js はマウスによる画像の切り替えを実装します (タイマーなし)

この記事の例では、マウス切り替え画像を実現するためのjsの具体的なコードを参考までに共有しています。...

Tomcat でのサーブレットの作成と実装に関する深い理解

1. サーブレットとは何か1.1. 正式な言葉で説明する:サーブレットは、動的な Web リソースを...

Mysql マスタースレーブ同期構成の実践の詳細な説明

1. はじめに以前、「MySQL マスター スレーブ同期の原理」という記事を書きました。この記事を読...

最適なウェブページ幅とその互換性のある実装方法

1. Web ページをデザインするときに、幅を決定するのは非常に面倒な作業です。 jb51.net ...

時点に基づくMySQLクイックリカバリソリューション

なぜこのような記事を書いたかというと、数日前の夜、仕事が終わろうとしていたときに、業務側で突然、テー...

Linux のスケジュールタスク Crontab コマンドの使用に関する詳細な説明と概要

crontab コマンドは、Unix および Linux で定期的な実行命令を設定するために使用され...

ORM を使用して MySQL にデータを追加する手順

【序文】 ORM を使用してデータベース内のデータを操作する場合、前提として、新しい ORM モデル...