mysql explain(分析インデックス)の使い方の詳しい説明

mysql explain(分析インデックス)の使い方の詳しい説明

EXPLAIN は、MySQL がインデックスを使用して選択ステートメントを処理し、テーブルを結合する方法を示します。より適切なインデックスを選択し、より最適化されたクエリ ステートメントを記述するのに役立ちます。

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

select * from statuses_status where id=11; を説明します。

説明欄の説明

テーブル: この行のデータがどのテーブルに関するものかを表示します

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がチェックする必要があると考える行数

extra: MySQL がクエリを解析する方法に関する追加情報。これについては表 4.3 で説明しますが、ここで確認できる悪い例は、temporary の使用と filesort の使用です。つまり、MySQL はインデックスをまったく使用できず、結果として取得が非常に遅くなります。

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

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

存在しない: MySQL は左結合を最適化します。左結合の条件に一致する行が見つかると、それ以上検索は行われません。

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

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

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

一時的な使用 このメッセージが表示される場合は、クエリを最適化する必要があります。ここで、MySQL は結果を格納するための一時テーブルを作成する必要があります。これは通常、group by ではなく、異なる列セットで order by を実行した場合に発生します。

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

システム テーブルには、システム テーブルという 1 つの行のみが含まれます。これはconst接続型の特別なケースです

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

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

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

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

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

all: この結合タイプは、以前の各レコードの完全スキャンを実行します。これは通常、好ましくないため、避ける必要があります。

分析インデックス分析

ここでは、記述した SQL がインデックスを最適に使用しているかどうかを分析できるように、explain の各フィールドを詳細に分析します。

まずselect_type: 選択クエリは単純なタイプと複雑なタイプに分かれています

複合型はサブクエリ(サブクエリ)とサブクエリを含むリスト(ドリブン)に分けられます。

単純:

駆動:

タイプに関する詳細な紹介:

システム、const、eq_ref、ref、範囲、インデックス、すべて
all : テーブル全体のスキャン
index : インデックス順にスキャンし、最初にインデックスを読み取り、次に実際の行を読み取ります。結果は完全なテーブルスキャンのままですが、主な利点はソートを回避できることです。インデックスがソートされているからです。
range : 範囲形式でスキャンします。

説明 select * from a where a_id > 1\G

ref : 非一意インデックスアクセス (通常のインデックスのみ)

テーブル a(a_id int not null、キー(a_id)) を作成します。
値(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)を挿入します。
mysql> explain select * from a where a_id=1\G

eq_ref : 一意のインデックス検索を使用する (主キーまたは一意のインデックス)
const : 定数クエリ

クエリ プロセス全体を通じて、このテーブルには最大で 1 つの一致する行があります。たとえば、主キー id=1 の場合、必ず 1 行だけになります。必要な結果は、テーブル データを 1 回だけ読み取ることで取得でき、テーブル データは実行プランが分解されるときに読み取られます。

結果が1でない場合は、インデックスや範囲などの他の型になります。

system : システムクエリ

null : 最適化プロセス中に結果が取得され、テーブルまたはインデックスにはアクセスされません。

possible_keys : 使用できるインデックス

key : 実際に使用されたインデックス

key_line : インデックスフィールドの最大可能長

ref :

キー列に選択されたインデックスの検索方法を示します。一般的な値には、const、func、NULL、特定のフィールド名などがあります。キー列が NULL の場合、つまりインデックスが使用されていない場合は、この値もそれに応じて NULL になります。

rows : スキャンする行数の推定値

Extra : 上記の情報に加えて追加情報を表示します

インデックスの使用

このクエリはカバーリング インデックスを使用します。つまり、テーブルにアクセスしなくても、インデックスを通じて結果を返すことができます。

「インデックスを使用」が表示されない場合は、テーブルデータが読み取られていることを意味します。

where の使用

MySQL サーバーがストレージ エンジンから行を受け取った後に「ポスト フィルタリング」を実行することを示します。いわゆる「ポストフィルタリング」とは、まずデータ行全体を読み取り、次にこの行が where 句の条件を満たしているかどうかをチェックすることです。条件を満たしている場合は保持され、条件を満たしていない場合は破棄されます。チェックは行が読み取られた後に行われるため、ポストフィルタリングと呼ばれます。

一時的な使用

一時テーブルの使用

テーブルを作成し、データを挿入します。

テーブル a(a_id int, b_id int) を作成します。
値(1,1),(1,1),(2,1),(2,2),(3,1)を挿入します。
mysql> explain 選択の区別 a_id から a\G

Extra :一時的な使用

MySQL は、個別の操作を実装するために一時テーブルを使用します。

ファイルソートの使用

クエリで要求される順序が使用されるインデックスの順序と一致している場合は、インデックスがソートされているため、結果はインデックスの順序で読み込まれ、返されます。そうでない場合は、結果を取得した後、クエリで要求される順序でソートする必要があります。このとき、Using filesort が表示されます。

ID による順序で * を選択します。

インデックスのない列の場合、order byを実行するとfilesortが表示されます。

以下もご興味があるかもしれません:
  • MySQLクエリ最適化におけるExplainの詳細な分析
  • MySQL での explain の使用方法の詳細な説明
  • MySQLの概要説明
  • MySQL のパフォーマンス分析と使用方法の説明
  • MySQL における explain の役割の詳細な説明
  • EXPLAIN コマンドの詳細な説明と MySQL での使用方法
  • MySQL での実行計画の explain コマンド例の詳細な説明
  • MYSQL 実行プランの説明
  • MySQLのEXPLAINコマンドの詳細な説明
  • MySQL の EXPLAIN ステートメントと使用例

<<:  jQuery はパーセンテージスコアリングの進捗バーを実装します

>>:  JavaScriptはランダムコードの生成と検証を実現する

推薦する

HTML タグ tbody の使い方と説明

tbody 要素は、thead 要素および tfoot 要素と組み合わせて使用​​する必要があります...

MySQL 8.0 アトミック DDL 構文の詳細な説明

目次01 アトミックDDLの紹介02 一部のDDL操作の実行動作の変更03 DDL 操作のログを表示...

LNMP と phpMyAdmin を Docker にデプロイする方法

環境準備:複数のコンテナに基づいてホストに lnmp をデプロイします。 nginx サービス: 1...

Vueプロジェクトを大画面に適応させる方法の例

レムの簡単な分析まず、remはCSS単位です。pxの固定ピクセル単位と比較すると、remはより柔軟性...

CSS calc() の数式に関する詳細な理解

数式 calc() は CSS の関数であり、主に数学演算に使用されます。 calc() を使用する...

MySQL バッチ挿入ループの詳細なサンプルコード

背景数日前、MySql でページングを行っていたときに、ページングに制限 0,10 を使用するとデー...

Vueはカスタムツリーコンポーネントを再帰的に実装します

この記事では、カスタムツリーコンポーネントを再帰的に実装するVueの具体的なコードを参考までに共有し...

DIV+CSS命名規則の詳細な説明はSEO最適化に役立ちます

1. CSSファイルの命名規則提案: 文字、_、-、数字を使用します。文字で始まる必要があり、純粋な...

Bootstrap5 ブレークポイントとコンテナの具体的な使用法

目次1. Bootstrap5 ブレークポイント1.1 モバイルファースト1.2 ブートストラップブ...

Xiaomi公式サイトの登録・ログイン機能を模倣するJavaScript

目次まずページレイアウトを構築する必要がありますJS関数1 JS関数2 JS関数3 JS関数4効果図...

純粋な CSS で DIV サスペンションを実装するサンプル コード (固定位置)

DIV フローティング効果 (固定位置) は CSS のみで実装されており、IE8、360、Fir...

Vue開発の詳細な説明 ソートコンポーネントコード

目次 <テンプレート> <ul class="コンテナ">...

iOS、Android、ミニプログラムアプリの敷居の低い開発のためのフロントエンドフレームワークを詳しく解説

現在、クロスプラットフォーム開発技術はもはや新しい話題ではありません。市場にはいくつかのオープンソー...

HTML の空リンク href="#" と href="javascript:void(0)" の違い

# には位置情報が含まれます。デフォルトのアンカーは #top で、これは Web ページの上部です...

HTML相対パスの親ディレクトリと子ディレクトリの書き方

親ディレクトリを指定する方法../ はソース ファイルの親ディレクトリを表し、../../ はソース...