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はランダムコードの生成と検証を実現する

推薦する

Linuxにおけるselinuxの基本設定チュートリアルの詳細な説明

selinux ( Security-Enhanced Linux)は、Linux カーネル モジュ...

ZabbixはLinuxシステムサービスのプロセスを監視

Zabbix は Linux システムのサービス ユニットを監視するためのルールを自動的に検出します...

Vue でよく使われる命令 v-if と v-show の違いを簡単に分析します。

目次序文1.v-ショー2.v-if 3. v-showとv-ifの違い1. 原則の違い2. アプリケ...

jQueryメソッド属性の詳細な説明

目次1. jQueryの紹介2. jQueryセレクター2.1 5つの基本セレクタ2.2 4種類の関...

MySQLで現在の時間間隔の前日のデータをクエリする

1. 背景実際のプロジェクトでは、分散スケジュールされたタスク実行の状況に遭遇することがあります。ス...

ウェブデザインの発展と西洋建築の類似点は何でしょうか?

歴史は常に驚くほどうまく繰り返される。西洋建築とウェブデザインは、どちらも工学と芸術の組み合わせです...

ページネーションの例とベストプラクティス

<br />構造と階層により複雑さが軽減され、読みやすさが向上します。記事やサイトが整理...

Vue モバイル開発で better-scroll を使用するときにクリック イベントが失敗する問題の解決策

最近、モバイル プロジェクトの開発方法を学ぶために vue を使用し、スクロールには better-...

Fabric.js は DIY ポストカード機能を実装します

この記事では、DIYポストカード機能を実現するためのfabricjsの具体的なコードを参考までに共有...

Ubuntuが仮想マシンでインターネットに接続できない問題の解決策

インターネットに接続できない仮想マシンをセットアップするのは非常に面倒です。ここでは、Ubuntu ...

MySQLで大きなテーブルをエレガントに削除する方法について簡単に説明します

目次1. 切り捨て操作1.1 MySQL truncate はどのような操作を実行しますか? 1.2...

CocosCreatorで複数のタイマーを使用する方法の詳細な説明

1.タイムアウトを設定する3 秒後に abc を印刷します。一度だけ実行します。 setTimeou...

正の整数かどうかを判断するMYSQLカスタム関数の例コード

関数を記述できます。主に正規表現を使用して判断を行います。入力文字が空の場合は、「-」を使用して置き...

HTML テーブル マークアップ チュートリアル (5): ライト ボーダー カラー属性 BORDERCOLORLIGHT

表では、左上の境界線の色を個別に定義したり、セルの右下の境界線の色を定義したりできます。これら 2 ...

Swiper.jsプラグインを使用すると、カルーセル画像を非常に簡単に実装できます。

Swiper は、携帯電話やタブレットなどのモバイル端末向けに設計された、純粋な JavaScri...