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

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

推薦する

Ajax responseText による JSON データの解析のケース スタディ

ajax 処理後にサーバーから返される responseText が JSON データであるという問...

MySQL 5.7 で my.ini ファイルが見つからない場合の解決策

my.ini とは何ですか? my.ini は、MySQL データベースで使用される設定ファイルです...

UbuntuへのDocker CEのインストール

この記事は、Ubuntu 17.10 での Docker CE のインストールを記録するために使用さ...

トランジションコンポーネントのアニメーション効果を使用した Vue サンプルコード

トランジションドキュメントアドレスは、フェードインとフェードアウト効果を実現するための背景ポップアッ...

Vue3+スクリプト設定+ts+Vite+Volarプロジェクト

目次Viteを使用してvue + tsプロジェクトを作成するVue 3の3つの構文オプションAPIコ...

HTML テーブル マークアップ チュートリアル (30): セルの暗い境界線の色属性 BORDERCOLORDARK

セルでは、暗い境界線の色を個別に定義できます。基本的な構文<TD ボーダーコロダーク=colo...

editplus の Zen コーディング例コードの説明

たとえば、次のように入力します。 XML/HTML コードdiv#ページ>(div#ヘッダー&...

Linux7 ベースの Hadoop のインストールと構成の詳細なグラフィック説明

上記のように材料を準備します(ps: hadoop-3.1.2-srcはhadoop-3.1.2に変...

Linux環境でrmによって誤って削除されたファイルを回復する方法

目次序文RMの後には希望はあるのでしょうか?最前線を使ってファイルを取得するextundeleteを...

CentOS6.9 での MySQL 5.7.17 のインストールと設定のチュートリアル

CentOS6.9はMysql5.7をインストールします。参考までに、詳細は次のとおりです。 1. ...

nginx をシャットダウン/再起動/起動する方法

閉鎖サービス nginx 停止systemctl 停止 nginx起動するサービス nginx 開始...

4 つの主要な SQL ランキング関数 ROW_NUMBER、RANK、DENSE_RANK、NTILE の使用方法の紹介

1. ROW_NUMBER()定義: ROW_NUMBER() 関数は、select によってクエリ...

CSS3 でクールなスライス画像カルーセル効果を実現

今日は、CSS を使用してクールな画像カルーセル コンポーネントを作成する方法を学びます。その原理は...

JavaScript で円形のプログレスバー効果を実装する

この記事では、円形のプログレスバー効果を実現するためのJavaScriptの具体的なコードを参考まで...

最初のReactページを作成する方法

目次Rractとは何ですか?背景React スキャフォールディングJSXとは何かRractとは何です...