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を使用して人間と猫のコミュニケーションアプレットを実装する

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

推薦する

Docker で php-nginx-alpine イメージをゼロから構築する方法

これまでにも Docker 環境でいくつかのプロジェクトを実行したことはありますが、まだイメージをよ...

Mysql通信プロトコルの詳細な説明

1.Mysql接続方法MySQL 通信プロトコルを理解するには、まず MySQL サーバーへの接続に...

nginxワーカープロセスループの実装

ワーカープロセスは、起動されると、まず自身の動作に必要な環境を初期化し、次に実行する必要があるイベン...

VUE+CanvasはシンプルなGobangゲームの全プロセスを実現します

序文レイアウトの点では、Gobang はランダムな動きを目的とするゲームよりも実装がはるかに簡単で、...

Ubuntuデュアルシステムが起動時に停止する問題の解決方法の詳細な説明

起動時に Ubuntu デュアル システムが停止する問題の解決方法 (Ubuntu 16.04 およ...

Linux での sshd サービスとサービス管理コマンドの詳細な説明

sshd SSH は Secure Shell の略で、アプリケーション層のセキュリティ プロトコル...

Vue が Bibibili のホームページを模倣する際の問題

エンジニアリング構造プロジェクトは2つの部分に分かれています。bilibili-apiはAPIインタ...

Tudou.com フロントエンドの概要

1. 分業とプロセス<br />Tudou.comでは、プロジェクト開発が中核であり、誰...

JavaScriptでカレンダー効果を素早く実装

この記事では、カレンダー効果を素早く実現するためのJavaScriptの具体的なコードを例として紹介...

シンプルな虫眼鏡効果を実現するJavaScript

大きな箱の中に写真があります。マウスをその上に置くと、半透明のマスク レイヤーが表示されます。マウス...

Vueのコンポーネントの詳細な説明

目次1. コンポーネントの登録2. コンポーネントの使用3. 父から息子へ4. 息子から父へ5. ス...

Mysqlトランザクション操作の失敗を解決する方法

Mysqlトランザクション操作の失敗を解決する方法トランザクションの原子性: トランザクションは、デ...

Ubuntu 18.04 Server バージョンのインストールと使用方法 (画像とテキスト)

1 システムのインストール手順OSバージョン:1804イメージのダウンロード: http://cd...

Linux centos7 に phpMyAdmin をインストールするチュートリアル

yum install httpd php mariadb-server –yランプの動作環境を設定...

IntelliJ IDEA で Java を使用して MySQL データベースに接続する方法の詳細な説明

1. MySQLデータベースをダウンロードし、インストールして設定するダウンロードアドレス: htt...