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マスタースレーブデータベース構築方法の詳細な説明

この記事では、MySQL マスター/スレーブ データベースの構築方法について説明します。ご参考までに...

Nginx の realip モジュールの使い方の基礎学習

序文nginx モジュールには、公式とサードパーティの 2 種類があります。nginx のインストー...

MySQL学習エンジンの詳細な説明、説明、権限

エンジン導入InnodbエンジンInnodb エンジンは、データベース ACID トランザクションを...

MySQLバッチは特定のフィールドのスペースを削除します

Mysql で特定のフィールドからスペースを一括削除する方法はありますか?文字列の前後のスペースだけ...

Vueのwatch、computed、methodsの違いのまとめ

目次1 はじめに2 基本的な使い方2.1 方法2.2 計算プロパティ2.3 リスナーを見る3 3つの...

DockerがMySQL構成実装プロセスを開始

目次実際の戦闘プロセスまずは主なコマンドと詳細を一つずつ説明しましょう起動が成功したかどうかを確認す...

珍しいけれど役に立つJSテクニックをいくつか紹介します

序文プログラミング言語には通常、さまざまな隠されたトリックが含まれており、これらのトリックを上手に使...

Mysql は null 値の first/last メソッドの例を実装します

序文MySQL が SQL SELECT コマンドと WHERE 句を使用してテーブルからデータを読...

WeChat アプレット wxs 日付と時刻処理の実装例

目次1. 日付までのタイムスタンプ2. UTCを北京時間に変換するWXS (WeiXin Scrip...

CSSのline-heightを継承する方法

Line-height はどのように継承されますか?30px などの特定の値を書き込むと、この値が継...

Reactの3つの主要属性における状態の使用の詳細な説明

目次クラスコンポーネント機能コンポーネントsetStateの落とし穴React では多くの場所でデー...

MySQL の Docker インストールと設定手順

目次序文環境インストールMySQLコンテナを作成して起動する思い出させるMySQLコンテナコマンドを...

Navicatを使ってMySQLを操作する方法

目次序文: 1. Navicatの紹介2. シンプルなチュートリアルの共有接続管理ライブラリテーブル...

JavaScript によるダイナミッククリスマスツリーの詳細な説明

目次1. CSS のみを使用して作成したアニメーションのクリスマスツリー2. CSS のみを使用して...

JDBC を MySQL 5.7 に接続する方法

1. まずMySQLとEclipseの環境を準備します。環境がセットアップされたら、Eclipseの...