MySQLクエリ文の実行プロセスを理解するための記事

MySQLクエリ文の実行プロセスを理解するための記事

序文

要件を満たす特定のデータをデータベースから取得する必要があります。Select ABC FROM T WHERE ID = XX などの SQL を書くのは簡単です。では、このようなリクエストをデータベースに送信すると、データベースはどのような処理を実行するのでしょうか。

今日は、MYSQL を例に、MySQL データベースのクエリ プロセスを明らかにし、データベースの一部を皆さんに知ってもらいます。

MYSQL アーキテクチャ

MySQL アーキテクチャ

MySQL は主にサーバー層とストレージエンジン層に分けられます。

サーバー レイヤーには、コネクタ、クエリ キャッシュ、アナライザー、オプティマイザー、エグゼキュータなどが含まれます。ストアド プロシージャ、トリガー、ビュー、関数など、すべてのクロス ストレージ エンジン機能は、このレイヤーに実装されています。また、一般的なログ モジュールである binlog ログ モジュールもあります。

ストレージ エンジン層は、データの保存と取得を担当します。アーキテクチャ モードはプラグイン ベースであり、InnoDB、MyISAM、Memory などの複数のストレージ エンジンをサポートします。現在最も一般的に使用されているストレージ エンジンは InnoDB (トランザクションをサポート) であり、MySQL バージョン 5.5.5 以降ではデフォルトのストレージ エンジンとなっています。

コネクタ

コネクタは主に、アカウント パスワード、権限、その他の操作の検証を含む、データベースへのユーザー ログインとユーザー ID 認証を担当します。

ユーザー パスワードが正しくない場合は、「ユーザーのアクセスが拒否されました」というエラーが表示され、クライアント プログラムの実行が終了します。

ユーザー アカウントのパスワードが承認されている場合、コネクタは権限テーブル内のユーザーのすべての権限を照会します。この接続における以降のすべての権限ロジックの判断は、この時点で読み取られた権限データに依存します。つまり、接続が切断されない限り、管理者がユーザーの権限を変更しても、ユーザーには影響はありません。

クエリキャッシュ

クライアントがサーバーとの接続を確立した後、MySQL はクエリ ステートメントを実行するときに最初にキャッシュをクエリして、この SQL が以前に実行されたかどうかを確認します。以前に実行されたステートメントとその結果が、キーと値のペアの形式でメモリに直接キャッシュされます。キーはクエリステートメントであり、値はクエリ結果です。クエリがこのキャッシュ内で直接キーを見つけることができれば、その値はクライアントに直接返されます。ヒットがない場合は、後続の操作を実行する必要があり、完了後に次の呼び出しを容易にするために結果がキャッシュされます。

これを見た後、あなたの目は輝きますか?この素晴らしい機能を有効活用したいという衝動に駆られますか?

実際、ここでクエリ キャッシュを使用することは推奨されません。クエリ キャッシュは非常に頻繁に期限切れになります。テーブルが更新される限り、このテーブルのすべてのクエリ キャッシュがクリアされます。したがって、結果を保存するのに多大な労力を費やしたにもかかわらず、使用できるようになる前に更新によって結果が消去される可能性が非常に高くなります。更新の負荷が大きいデータベースの場合、クエリ キャッシュのヒット率は非常に低くなります。システム構成表のように長期間更新されない表であれば別ですが、こういったシステム構成は構成プラットフォーム上に置いた方がよいのではないでしょうか。

MYSQL8.0ではクエリキャッシュ機能が削除されました。公式もこの機能の実際の適用シナリオは少ないと判断し、単純に削除したとのことです。

アナライザ

Mysql がクエリ キャッシュにヒットしない場合は、アナライザーに入ります。アナライザーは主に、SQL ステートメントの目的を分析するために使用されます。アナライザーは主に次の 2 つのステップに分かれています。

  • 字句解析: SQL 文は複数の文字列で構成されています。まず、select、クエリ テーブルの提案、フィールド名の提案、クエリ条件の提案などのキーワードを抽出します。
  • 構文解析: 字句解析の結果に基づいて、構文解析は主に、入力した SQL 文が正しいかどうか、および MYSQL 構文に準拠しているかどうかを判断します。文が正しくない場合は、「SQL 構文にエラーがあります」というエラーメッセージが表示されます。

字句解析器はクエリステートメント全体をさまざまなトークンに分解し、構文解析器は定義されたシステム言語に基づいて「さまざまなトークン」を MySQL にとって意味のある組み合わせに変換します。最後に、システムは、オプティマイザーが依存するデータ構造である構文ツリー (AST) を生成します。

オプティマイザ

アナライザーの後、MySQL はあなたが何をしようとしているのかを認識します。実行を開始する前に、まずオプティマイザーによって処理される必要があります。

なぜオプティマイザーが必要なのでしょうか?

  • オプティマイザーには多くの複雑な最適化手法が含まれており、多くの場合、優れたプログラマーでも理解できないほどです。システムの自動最適化は、これらの最適化技術を誰もが利用できるようにすることと同じです。
  • オプティマイザーは、テーブル内の行数、テーブル内の各列の分布など、データ ディクショナリから多くの統計情報を取得できます。オプティマイザーは何百もの異なる実行プランを検討できますが、プログラマーは通常、限られた数の可能性しか検討できません。
  • この情報に基づいて効果的な実行プランを選択できますが、ユーザー プログラムがこの情報を取得することは困難です。

つまり、オプティマイザは構文解析ツリーの形状を変更し、構文解析ツリーをクエリツリーに変換して、実行プランを決定します。

アクチュエータ

MySQL はアナライザを通じて何を実行するかを認識し、オプティマイザを通じてそれを実行する方法を認識しているため、エグゼキュータ ステージに入り、ステートメントの実行を開始します。

実行を開始する際には、まずユーザーにクエリを実行する権限があるかどうかを確認する必要があります。権限がない場合は、ユーザーに権限がないことを示すエラー メッセージが返されます。許可があれば、エンジンのインターフェースが呼び出され、インターフェース実行の結果が返されます。

ステートメント分析

次の実際の SQL クエリ ステートメントを使用して、MYSQL クエリの実行プロセスを分析してみましょう。

t.age='26' かつ t.account='javadaily' のユーザー t から ID、名前、性別、電話番号を選択します。

  • まず、クライアントはデータベースに接続する必要があります。アカウントとパスワードが正しくない場合は、エラー メッセージが直接返されます。正しい場合は、次の手順に進みます。
  • MYSQL8.0より前では、まずクエリキャッシュを検索し、このSQL文をキーにしてメモリ内に結果があるかどうかを問い合わせます。ある場合は、まず許可があるかどうかを確認します。許可がある場合はクライアントに返され、ない場合はエラーが報告されます。クエリキャッシュからヒットしない場合は、次のステップに進みます。
  • アナライザーは、字句解析を実行して、SQL ステートメントの主要な要素を抽出します。たとえば、上記のステートメントは選択クエリであり、クエリ対象のテーブル名は user、クエリ対象の列は id、name、sex、phoone、クエリ条件は age=26 および account=javadailly です。次に、キーワードが正しいかどうかなど、SQL ステートメントに構文エラーがないか確認します。チェックが OK の場合は、次の手順に進みます。
  • 上記のSQLには2つの実行プランがあります。オプティマイザは独自の最適化アルゴリズムに基づいて、最も実行効率の高いプランaを選択します(不正確な統計情報により、オプティマイザが誤った実行プランを選択する可能性があります)。最適化プランを決定した後、実行を開始します。

a. まず、account=javadaily のユーザーを照会し、次に age が 26 かどうかを確認します。 b. まず、age=26 のユーザーを見つけ、次に account=javadaily のユーザーを照会します。

  • 権限チェックを実行します。クエリ権限がある場合は、データベース エンジン インターフェイスを呼び出して実行結果を返します。それ以外の場合は、エラーを報告します。

要約する

これで、MySQL クエリ ステートメントの実行プロセスを理解するためのこの記事は終了です。MySQL クエリ実行プロセスに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • PHP で mysqli を使用して複数の SQL クエリ ステートメントを同時に実行する例
  • SQLクエリの実行順序をゼロから学ぶ
  • MySQLでSQLクエリ文がどのように実行されるかを分析する
  • Mysql系SQLクエリ文の書き順と実行順を詳しく解説
  • MySQL では SQL クエリはどのように実行されますか?
  • SQLクエリステートメントの実行プロセス

<<:  vue3を使用して人間と猫のコミュニケーションアプレットを実装する

>>:  設計仕様に準拠した設計は良い設計でしょうか?

推薦する

MySQL テーブルスペースとは何ですか?

今日皆さんにお伝えしたいトピックは、「皆さんがよく話題にするテーブル スペースとは一体何でしょうか。...

vue+django でファイルをダウンロードする例

目次1. 概要2. Django プロジェクト3. Vueプロジェクト1. 概要プロジェクトで、ダウ...

Dockerにelasticsearchとkibanaをインストールする方法

Elasticsearchは現在非常に人気があり、多くの企業が利用しているため、esを知らないと軽蔑...

Linux で特定のユーザーにフォルダーのすべてのコンテンツを許可するにはどうすればよいですか?

【問題分析】 chown コマンドを使用できます。ここで ch は change (変更) を表し...

UnityはMySQLに接続し、テーブルデータの実装コードを読み取ります

表は以下のとおりです。 Unity が読み取って呼び出すときのコード: データベース内の別のテーブル...

HTML フォームを送信するいくつかの方法_PowerNode Java Academy

方法1: 送信ボタンから送信する <!DOCTYPE html> <html>...

CSS を使用して固定ナビゲーションと左右スライドを備えたスクロール バーを作成する方法

上に示すように、ナビゲーションは上部に固定されており、左右にスライドしてさらにオプションをクリックで...

MYSQLの文字セット設定方法(端末の文字セット)の詳しい説明

序文ターミナルを使用してデータベースまたはテーブルを作成するたびに、文字セットが latin1 であ...

Docker を使用した nGrinder パフォーマンス テスト プラットフォームの導入プロセスの分析

nGrinderとは何ですか? nGrinder は、スクリプトの作成、テストの実行、監視、結果レポ...

制限を使用すると、MySQL のページングがどんどん遅くなるのはなぜですか?

目次1. テスト実験2. 制限ページング問題に対するパフォーマンス最適化手法2.1 テーブルをカバー...

JS のオブジェクトリテラルの詳細な説明

目次序文1. オブジェクト構築にプロトタイプを設定する1.1 __proto__ の使用における特殊...

HTML テーブル_Powernode Java アカデミー

HTMLで表を描くには、表タグを使用します。 trは行を意味しますtdは列を示すth はテーブ...

1 つの記事で Node.js の非同期プログラミングを学ぶ

目次 はじめに 同期 非同期とブロッキング JavaScript のノンブロッキング コールバック ...

Centos7 での Mysql5.7.19 の詳細なインストールチュートリアル

1. ダウンロード公式サイトからmysql-5.7.19-linux-glibc2.12-x86_6...