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

推薦する

HTML と CSS を使用して絵文字付きのコメント ボックスを作成する方法のチュートリアル

絵文字付きの HTML コメント ボックス。絵文字は Json データを通じて読み込まれ、好みに応じ...

HTMLの基礎 HTMLの構造

HTML ファイルとは何ですか? HTML は Hyper Text Markup Language...

SQLでEXPLAINコマンドを使用する方法

日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...

Dockerを使用してOracle_11gをインストールする方法

DockerでOracle_11gをインストールする1. oracle_11gイメージを取得する d...

実行中のDockerコンテナのポートマッピングを変更する方法

序文docker run がコンテナを作成して実行するときに、-p を使用してポート マッピング ル...

MySQL 5.7.18 無料インストールバージョンの設定チュートリアル

MySQL 5.7.18 無料インストール版のインストールチュートリアルMySQL は現在、世界で最...

MySQL テーブルパーティションの使用法と基本原理の詳細な説明

目次パーティションテーブルとはパーティションテーブルの適用シナリオパーティションテーブルの制限パーテ...

VMWare を使用して Windows 上で Linux 環境を構築する手順 (画像とテキスト)

Mac を返却して以来、元のラップトップは使用されていません。このラップトップの構成は非常に良好で...

MySQL データ操作 - DML ステートメントの使用

例示するDML(データ操作言語)とは、データベースの追加、削除、変更を行うための操作命令のことです。...

MySQL インストール プロンプト「詳細なヘルプについては NET HELPMSG 3534 と入力してください」の解決方法

今日、MySQL をインストールすると次のエラー メッセージが表示されます。 かなり長い時間ネットで...

CSS で左上の三角形を作成するいくつかの方法の詳細な説明

今日は、CSS を使用して左上の三角形を記述するいくつかの方法を紹介します。概略図(幅と高さを60p...

MySQLでconcat関数を使用する方法

以下のように表示されます。 //managefee_managefee テーブルの年と月を照会し、c...

MySQL 8 の新機能: 非表示のインデックス

背景インデックスは諸刃の剣です。クエリ速度は向上しますが、DML 操作も遅くなります。結局のところ、...

TSで最も一般的な宣言マージ(インターフェースマージ)

目次1. マージインターフェース1.1 非関数メンバー1.2 関数メンバー序文:今日お話ししたいのは...

Docker Swarm クラスタ管理の使用と原理の分析

Swarm クラスター管理導入Docker Swarm は Docker 用のクラスター管理ツールで...