MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化

MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化

ウェブサイトやサービスのパフォーマンスは、データベースの設計(適切な言語開発フレームワークを選択した場合)とデータのクエリ方法に大きく依存します。

MySQL のパフォーマンス最適化方法を理解しています。これには通常、インデックスの作成、複雑な結合クエリの回避、冗長フィールドの設定、中間テーブルの作成、クエリ キャッシュなどが含まれます。また、EXPLAIN を使用して実行プランを表示する方法も理解しています。

しかし、複雑な MySQL クエリ ステートメントの実行プロセスと内部メカニズム、MySQL Optimizer 自体によって行われる最適化、クエリ ステートメントの調整がパフォーマンスに与える影響とその原因についてはほとんどわかっていません。

この記事では、実行プロセスやインデックスの使用法など、いくつかの重要な概念についてさらに詳しく説明し、その理由を理解しようとします。

これにより、単純な MySQL 最適化で良好な結果が得られる場合に、盲目的に NoSQL ストレージに切り替えたり、インフラストラクチャのアップグレードに投資したりする必要がなくなります。

仕事をうまくやり遂げたいなら、まずツールを磨かなければなりません。ここではまず、MySQL クエリ ステートメントのパフォーマンス分析ツールを紹介します。

MySQL の EXPLAIN コマンドは、クエリのパフォーマンスを分析するためのツールです。EXPLAIN の出力の各行は、クエリ ステートメント内のテーブルの実行プランの説明に対応します。出力列の意味は次のとおりです。

上記の表の「タイプ」列は、テーブルの関連付けのタイプです。一般的なタイプは次のとおりです (関連付けクエリの効率の高い順に並べています)。

const (定数接続)、例: SELECT * FROM user WHERE id=1;
eq_ref (等値参照)、例: SELECT * FROM user,card WHERE user.id=card.userid;
ref (参照)。SELECT * FROM user,card WHERE user.last_name='test'; など、一意でないインデックスに使用されます。
範囲、例: SELECT * FROM tbl_name WHERE key_column > 10;
index: インデックスに従ってデータを読み取ります。インデックスにすでにクエリ データが含まれている場合は、インデックス ツリーのみをスキャンする必要があります。それ以外の場合は、All と同様に完全なテーブル スキャンが実行されます。
ALL (すべて)、テーブル全体のスキャン

キー列はインデックスを表し、行はスキャンされる行の推定数を表します。

Extra は追加情報を示します。一般的なものは次のとおりです (これもクエリ効率の降順で並べられています)。

インデックスの使用: インデックスの使用を示します。同時に「場所の使用」が表示されている場合は、インデックスを使用してレコードを検索および読み取ります。「場所の使用」が見つからない場合は、インデックスにクエリ データが含まれており、追加の検索は不要であることを意味します。
where: を使用すると、条件付きクエリを示します。type 列が ALL または index で、この情報が表示されない場合は、すべてのデータを返すという誤ったクエリを実行している可能性があります。
filesort の使用: 「ファイル インデックスの使用」の意味ではありません。 Filesort は、MySQL によって実装されるソート戦略です。このメッセージは通常、ソート ステートメント ORDER BY が使用されるときに表示されます。
一時テーブルの使用: 結果を取得するために、一時テーブルが使用されます。これは通常、複数のテーブルが結合され、結果が並べ替えられる場合に発生します。

EXPLAIN に次の 2 つのメッセージ (Using filesort、Using temporary) が表示され、行が比較的大きい場合は、通常、クエリ ステートメントを調整するか、インデックスを追加する必要があることを意味します。つまり、これら 2 つのメッセージを排除する必要があります。

以下は EXPLAIN 結果の例です (ユーザー プロファイル テーブルからニックネームと性別を検索し、ユーザー テーブル内のユーザー フォロワーの数で並べ替えます)。

上記のクエリ ステートメントは、典型的な問題の例です。filesort の使用と temporary の使用の具体的な意味、および上記のステートメントを最適化する方法については、クエリ プロセスと原則と併せて次の記事で説明します。

以上がこの記事の全内容です。お役に立てれば幸いです。他にご質問がございましたら、メッセージを残してご連絡ください。 引き続き 123WORDPRESS.COM にご注目ください。

以下もご興味があるかもしれません:
  • pymysqlクエリステートメントで in を使用する際のパラメータの受け渡しの問題について簡単に説明します。
  • MySQL ファジークエリステートメントコレクション
  • MySQLクエリステートメントの簡単な操作例
  • PHP で mysqli を使用して複数の SQL クエリ ステートメントを同時に実行する例
  • MySQL インフラストラクチャ チュートリアル: クエリ ステートメント実行プロセスの詳細な説明
  • OR キーワードを使用した MySql 複数条件クエリ ステートメント
  • And キーワードを使用した MySQL の複数条件クエリ ステートメント
  • MySQL の制限使用法とページングクエリステートメントのパフォーマンス分析の詳細な説明
  • PHP mysqli クエリステートメントの戻り値の型の例の分析
  • MySQLクエリステートメントの完全なコレクション
  • 最も完全なMySQLクエリステートメントコレクション
  • Oracle、MySQL、SqlServe のページング クエリ ステートメントの違いの概要
  • MySQLクエリ文の実行プロセスの詳細な説明

<<:  NextCloud プライベート クラウド ストレージ ネットワーク ディスクの構築に関する詳細なチュートリアル

>>:  vue-cli 設定では Vuex の完全なプロセスレコードを使用します

推薦する

きちんとした標準的なHTMLタグの書き方を学ぶ

優れた HTML コードは美しい Web サイトの基礎となります。私が CSS を教えるときは、まず...

HTML CSS を使用して div またはテーブルを指定した位置に固定する方法

CSSコードコンテンツをクリップボードにコピー.bottomTable{背景色: rgb (249,...

HTML 特殊文字エンコーディング CSS3 コンテンツに関する簡単な説明:「私は特別なシンボルです」

プロジェクトで使用されている特殊文字とアイコンHTMLコードXML/HTML コードコンテンツをクリ...

文字列から指定された文字を削除または抽出する JavaScript メソッド (非常によく使用されます)

目次1. 部分文字列() 2. サブストラクチャ() 3.インデックス() 4.最後のインデックス(...

Vue ルーティング遅延読み込みの詳細

目次1. ルートの遅延読み込みとは何ですか? 2. ルートの遅延読み込みの使用1. ルートの遅延読み...

IDEA で Docker プロジェクトをデプロイする手順

現在、ほとんどのプロジェクトが Docker 上にデプロイされ始めていますが、デプロイのプロセスはま...

IE6 での背景画像キャッシュ

IE6 での CSS 背景画像のちらつきバグ (IE6 の背景画像キャッシュの問題) IE6 は、背...

aタグのhref属性とonclickイベントの比較

まず、href 属性と onclick イベントの実行順序について説明します。マウスが a タグをク...

jQueryはテーブル行データのスクロール効果を実現します

この記事の例では、テーブル行データのスクロール効果を実現するためのjQueryの具体的なコードを参考...

Dockerはnginxをデプロイし、フォルダとファイル操作をマウントします

この間、私は docker を勉強していたのですが、nginx をデプロイするときに行き詰まりました...

MySQL 5.6 のインストール手順(画像とテキスト付き)

MySQL はオープンソースの小規模リレーショナル データベース管理システムです。現在、MySQL...

あまり多くのコードを書かずに、ハイパーリンクを使ってシンプルで美しいカスタムチェックボックスを実装できます。

今日ふと、HTML でチェックボックスのスタイルを変更できる範囲が限られていることと、チェックボック...

CSS の高度な使い方(実戦で活用)

1. ul タグには、Mozilla ではデフォルトでパディング値がありますが、IE ではマージン値...

MySQL の replace と replace into の詳細な例 into_Mysql

MySQL の replace と replace into はどちらも頻繁に使用される関数です。...

JavaScript のマイクロタスクとマクロタスクの説明

序文: js はシングルスレッド言語なので、非同期にすることは不可能です。しかし、js のホスト環境...