MySQLでSELECT文が実行される仕組み

MySQLでSELECT文が実行される仕組み

1. マクロの観点からMySQLを分析する

まず、典型的な図( MySQL論理アーキテクチャ図を見てみましょう。

上の図のクライアントは、PHP、Java などとして直接理解できます。次に、接続とスレッドの処理について説明します。この部分は MySQL に固有のものではなく、ほとんどのクライアントとサーバーは同様の構造になっています。

したがって、一般的に言えば、MySQL はサーバー層とストレージ エンジン層の 2 つの層に分けられます。

サーバー層には、主に、接続層、クエリ キャッシュ、アナライザー、オプティマイザー、エグゼキューターなどの重要なモジュールが含まれます。この層には、よく使用されるフォーマット時間、暗号化などの MySQL コア API 部分も含まれます。

面接中に Innodb と Myisam ストレージ エンジンの違いについて何度も質問しているので、ストレージ エンジンについては皆さんよくご存知だと思います。

では、MySQL にこれほど多くのストレージ エンジンがある理由について考えたことはありますか?

すべてのテクノロジーは現在の問題から生まれており、MySQL も例外ではありません。

MySQL のストレージ エンジンのアーキテクチャはプラグイン ベースであるため、任意に切り替えることができ、固定されていません。また、MySQL バージョン 5.5 のストレージ エンジンは、デフォルトですでに Innodb になっています。

2. SQL ステートメントを実行するには、どの程度の困難が必要ですか?

MySQL の詳細なアーキテクチャ図

図には、おなじみの奇妙なクエリ キャッシュ モジュールも示されていますが、これは MySQL 8.0 では存在しなくなりました。

まず、このアーキテクチャ図で SQL ステートメントがどのように機能するかを概観します。

2-1 コネクタ

mysql -u root -p データベースコマンドに接続します。実行後、パスワードを入力する必要があります。従来の TCP ハンドシェイクが完了すると、コネクタが機能します。

コードが正しくない場合は、ユーザー 'root'@'localhost' のアクセスが拒否されました (パスワードの使用: YES、エラー コード 1045) が返されます。

接続情報が正しければ、入力したユーザー アクセス権限テーブルに基づいてユーザーの権限が取得されます。ここで明確にしておく必要があるのは、正常にログインした後、他のユーザーが権限を変更しても、接続が切断されるまで権限は変更されないということです。

接続が完了したら、何もせずに show processlist を実行すると、空の接続を示す sleep が表示されます。

接続が成功した後に操作が実行されない場合、MySQL が自動的に切断されるまでにどのくらいの時間がかかるかご存知ですか?

時間を表示するには、「wait_timeout」のような show variables を実行します。

MySQL では、特別な説明がない限り、すべての時間は秒単位です。時間変換によると、空の接続は 8 時間続くことがわかります。

2-2 クエリキャッシュ

注意すべき点は、MySQL 8.0 がキャンセルされたことです。この問題は何度も言及されています。特に、8.0 未満の MySQL バージョンを使用している友人は注意が必要です。 8.0 に切り替えると、この問題が発生する可能性があり、解決方法がわからない場合があります。

MySQL 8.0 がクエリ キャッシュ モジュールをキャンセルする理由

このモジュールの設計では、クエリ ステートメントをキーとして使用し、結果をキャッシュの値として使用します。テーブルが更新されると、以前のキャッシュはすべてクリアされます。それは、一生懸命書いたコードが提出後に他の人によって上書きされるのと同じくらい辛いことです。

MySQL バージョン 8.0 未満では、クエリ キャッシュを使用するかどうかを制御するためのパラメータ query_cache_type = enmand が提供されています。設定後、デフォルトの選択ステートメントはキャッシュされません。

一部のシナリオで機能する場合は、select キーワードの後に​​ sql_cache を追加できます。

選択ステートメントが以前にキャッシュされている場合、結果セットはここで直接返されますが、キャッシュされていない選択ステートメントの場合はより困難になり、長い道のりを続ける必要があります。

2-3 アナライザー

MySQL 8.0 より前では、アナライザーに入る前にキャッシュするかどうかが決定されます。MySQL 8.0 以降では、検証が成功するとコネクタは直接アナライザーに入ります。

アナライザーは、文字通りの意味によれば、実行される SQL ステートメントが何であるか、そして何を行うかを分析するものです。

たとえば、select * from user where id = 1を実行します。

MySQL はまずこれが select に基づくクエリ ステートメントであると判断し、次に user をテーブル名として、id をフィールド名として識別します。このプロセスは、字句解析と呼ばれます。

次のステップは、SQL 構文が正しいかどうかを確認し、構文分析を実行することです。構文が正しくない場合は、「SQL 構文にエラーがあります」というエラーが表示されます。通常、エラーは使用中の近くで見つかります。

2-4 オプティマイザー

この時点で、MySQL は実行したいことを認識していますが、それを実行するための最適な方法を選択する必要があります。

オプティマイザーは何を最適化するのでしょうか?

たとえば、複数のインデックスがある場合にどのインデックスを選択するか、複数のテーブルが関連付けられている場合の接続順序などです。

ここで疑問に思うのは、オプティマイザーは複数テーブルの関連付けの結合順序を最適化するので、SQL ステートメントを記述するときに結合順序を考慮する必要はないのではないかということです。

もちろん違います。MySQL の作業量を減らすことができる場合は、できるだけ減らしてください。それでも、大きなテーブルを動かすには小さなテーブルを使用するのが原則です。

2-5 アクチュエータ

この SQL 文は、何をどのように行うかが決定された後にのみ実際に実行されます。最初に権限の検証が行われます。権限がない場合は、権限エラーが直接返されます。権限がある場合は、テーブルに定義されているストレージ エンジンに応じて、対応するエンジンが提供するインターフェイスが使用されます。

実行フローチャート

上の図には、本文中のすべての知識ポイントが含まれており、MySQL 全体の一般的な実行フローチャートでもあります。

これで、MySQL で SELECT ステートメントを実行する方法についての記事は終了です。MySQL の SELECT ステートメントを実行する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Python の基礎: Python ループ制御文 break/continue の詳細な説明
  • C言語における最初のif文の詳細な説明
  • C言語入門 - 選択、if、switch文、コードブロックの学習
  • if/else および switch/case ステートメントを C++ テーブル駆動型に置き換える方法
  • C言語における一般的なフロー制御文
  • JavaScriptステートメントを理解するのに役立つ記事
  • Pythonはswitch/case文を実装する
  • C言語上級チュートリアル: ループ文の欠陥の詳細な分析
  • C言語制御文ループ
  • MyBatis の SQL ステートメントにおける CDATA タグの使用手順
  • JavaScript における 3 つの for ループ ステートメントの使用の概要 (for、for...in、for...of)
  • Golang の switch 文の柔軟な書き方の紹介
  • C言語の基礎: C言語の3大文の注意点

<<:  Windows Server 2012 でファイル サーバーを構築するための詳細な手順

>>:  CSS疑似クラスの右下隅をクリックすると、選択されたサンプルコードを示すチェックマークが表示されます。

推薦する

Pythonの関数知識についての簡単な説明

目次関数パラメータの2つの主要なカテゴリ位置パラメータ可変長パラメータ名前空間要約する関数パラメータ...

MySQL で最大接続数を正しく変更する 3 つの方法

MySQL データベースをインストールすると、デフォルトの MySQL データベースの最大接続数が ...

docker を使用してコード サーバーをデプロイする方法

画像をプルする # docker pull codercom/code-server # Docke...

Vuex全体のケースの詳細な説明

目次1. はじめに2. 利点3. 使用手順1. Vuexをインストールする2. Vuexを参照する3...

Linux で実行可能ファイルを実行するときに「そのようなファイルまたはディレクトリはありません」というプロンプトが表示される場合の解決策

最近、Linux オペレーティング システムを使用して実行可能ファイルを実行していたところ、「そのよ...

MySQL IDは1から増加し始め、不連続IDの問題を素早く解決します

mysql idは1から始まり、不連続なidの問題を解決するために自動的に増加します。強迫性障害の私...

MySQL で group by を使用すると常にエラー 1055 が発生します (推奨)

MySQL で group by を使用すると常にエラー 1055 が発生するため、原因を確認する...

Nodejs での WeChat アプレット メッセージ プッシュの実装

サブスクリプションメッセージテンプレートを選択または作成するWeChat アプレットにログインし、「...

VueはGraphVisを使用して無限に拡張された関係グラフを開発します

1. GraphVis 公式サイトにアクセスして、対応する js をダウンロードします。js の新し...

ウェブページにコンテンツが多すぎる場合に、下から上へ素早く戻る方法

Web フロントエンド開発では、ページに多くの記事を表示することが避けられません。記事の最後にあるク...

知らないかもしれないmysqldumpパラメータ

前回の記事で、mysqldump バックアップ ファイルに記録されるタイムスタンプ データは UTC...

MySql 5.7.17 無料インストール構成チュートリアルの詳細な説明

1. mysql-5.7.17-winx64.zip インストール パッケージをダウンロードします ...

JavaScriptの基本的なインタラクションの詳細な説明

目次1. 要素の入手方法文書から入手ID取得クラス名 (className) を取得します。タグ名 ...

HTML における DTD の使用法の概要

DTD はマークアップの文法規則のセットです。これは XML 1.0 仕様の一部であり、HTML フ...

コードブロックのハイライトをコピーして表示できる js プラグイン highlight.js + clipboard.js 統合

主に2つの側面から: 1. ハイライト/改行2. コードのコピーボタンこれら両方には既製のプラグイン...