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

推薦する

特定の MySQL テーブルの完全データと増分データをメッセージ キューに同期する - ソリューション

目次1. 当初の需要2. 解決策3. 運河の導入と設置運河の仕組み建築インストール4. 検証1. 当...

Workbench を介して MySQL データベースにリモートでアクセスする方法の詳細な説明

序文Workbench が 1 台のコンピューターにインストールされており、別の Ubuntu サー...

初心者のための入門チュートリアル⑤:ウェブサイト登録はとても簡単、簡単な登録のヒント

スペースを購入してウェブサイトを構築したことがある友人なら、ウェブサイトは正式に開設する前に登録する...

JavaScriptは、ユーザーがチェックボックスをオンにする必要があるプロトコルの例を実装します。

js では、ログインまたは登録を確認する前に、ユーザーが特定の契約書を読むように設定します (使用...

Docker が elasticsearch を起動するときのメモリ不足の問題と解決策

質問Docker が elasticsearch をインストールして起動するときにメモリが不足するシ...

MySQLでホワイトリストアクセスを設定する方法

MySQLでホワイトリストアクセスを設定する手順1. ログイン mysql -uroot -pmys...

MySQL ログインおよび終了コマンドの形式

mysql ログインのコマンド形式は次のとおりです。 mysql -h [hostip] -u [ユ...

Nginx の break と last の違いの詳細な分析

まずは違いについて話しましょう最後に、書き換えられたルールは、次の場所と一致させるために書き換えられ...

あるテーブルからバッチデータをクエリし、それを別のテーブルに挿入する MySQL の完全な例

事前に言っておくNodejs はデータベースを非同期操作として読み取るため、データベースがデータを読...

OR キーワードを使用した MySql 複数条件クエリ ステートメント

前の記事では、And キーワードを使用した MySql の複数条件クエリ ステートメントを紹介しまし...

CentOS に Memcached と PHP Memcached 拡張機能をインストールする

高性能分散メモリオブジェクトキャッシュシステムMemcachedについては、別の記事「Windows...

XHTML CSS ウェブサイトデザインの利点と問題点

XHTML は現在国際的に推奨されている標準的な Web サイト設計言語です。Webjx.com も...

Baidu Maps を Web ページに埋め込み、Baidu Maps API を使用してマップをカスタマイズする詳細な手順

ウェブページにBaiduマップを挿入するBaidu Maps を自分の Web ページに追加したい場...

CSS3の新しい背景プロパティの詳細な説明

これまで、CSS の背景の属性には、color、image、repeat、attachment、po...

ローカルで起動したときに Vue プロジェクトがクッキーを保持できない問題を解決する

vueプロジェクトをパッケージ化してサーバーにデプロイし、正常にログインできるが、ローカルで起動する...