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

推薦する

XHTML 入門チュートリアル: XHTML ハイパーリンク

ハイパーリンクはインターネット全体を接続していると言っても過言ではありません。ハイパーリンクは、別の...

ウェブページでよく使用される共有コードの完全なリスト(フロントエンドに必須)

コードをコピーコードは次のとおりです。 1. 新浪微博<a href="http:/...

Apache、Tomcat、Nginx サーバーの詳細な理解と比較分析

質問1件会社のサーバーはApacheを使用しており、バックエンドはPHP、サーバーはLinux C/...

MySQL Server 8.0.3 のインストールと設定方法のグラフィックチュートリアル

この文書はMySQL Server 8.0.3のインストールと設定方法を参考のために記録したものです...

Nodejs は JSON 文字列を JSON オブジェクトに変換するエラー解決法

JSON 文字列を JSON オブジェクトに変換するにはどうすればいいですか? JSON.parse...

MySQLクエリ文を書き換える3つの戦略

目次複雑なクエリとステップバイステップのクエリクエリステートメントを分割する共同クエリの分解問題のあ...

Vue検証コードコンポーネントの使い方の詳しい説明

この記事の例では、vue検証コードコンポーネントで使用される具体的な実装コードを参考までに共有してい...

フロントエンドの状態管理(パート 1)

目次1. フロントエンドの状態管理とは何ですか? 2. ヴュークス3. バス4. ウェブストレージ序...

Ubuntu 18.04の下のディレクトリにディスクをマウントします

導入この記事では、Ubuntu 18.04 デスクトップ システムでディスクを目的のディレクトリにマ...

Div CSS 命名標準 CSS クラスの命名規則 (SEO 標準に準拠)

検索エンジン最適化 (SEO) では実行すべきタスクが多数ありますが、その中でもコードの最適化は重要...

親要素を基準にCSSの位置を絶対的に設定する方法についての簡単な説明

ご存知のとおり、CSS の絶対位置はデフォルトでドキュメントに応じて設定されます。たとえば、posi...

HTML テーブル マークアップ チュートリアル (37): 背景画像属性 BACKGROUND

テーブル ヘッダーの背景画像を設定します。任意の GIF または JPEG 画像ファイルを使用できま...

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

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

MySQLカバーインデックスの使用例

カバーインデックスとは何ですか?クエリで使用されるすべてのフィールドを含むインデックスを作成すること...

Vueは画像のドラッグと並べ替えを実装します

この記事の例では、画像のドラッグと並べ替えを実装するためのVueの具体的なコードを参考までに共有して...