序文 私は以前から、SQL 文がどのように実行され、どのような順序で実行されるのかを知りたいと思っていました。そこで、さまざまな方面からの情報を調べてまとめ、以下の記事にたどり着きました。 このノートでは主に、MySQL の基本的なアーキテクチャとクエリ ステートメントの実行方法について記録します。 詳しい紹介を見てみましょう。 例えば、学生テーブルからid=2をクエリする場合 id=2 の学生から * を選択します。 このステートメントの実行フローを説明する前に、MySQL の基本的なアーキテクチャを見てみましょう。 この画像は Geek Time の MySQL 実践から引用したものです。この画像は MySQL の論理アーキテクチャを説明しています。
コネクタ データベースを使用する前に、データベースに接続する必要があります。接続ステートメントは mysql -h $ip -u $ユーザー名 -p $パスワード このプロセスは当社のコネクタが処理します。コネクタの主な機能は、クライアントとの接続を確立し、権限を取得し、接続を維持および管理することです。コネクタの使用中にユーザーの権限が変更された場合、すぐには有効になりません。これは、ユーザーの権限は接続時に読み取られ、権限は再接続によってのみ更新できるためです。 コネクタがクライアントと通信するためのプロトコルは TCP です。接続が確立された後、show processlist を使用して実行された接続の数を確認できます。 同時に、接続時間が 8 時間を超えると、スリープ状態で自動的に切断されます。これは MySQL のデフォルト設定です。切断されない場合は、このプロセスは長時間接続と呼ぶことができます。 これに対応するのが短い接続であり、これは 1 つまたは複数の操作を実行した後に切断することを意味します。 長時間の接続を連続して使用すると、大量のメモリリソースが占有されます。MySQL 5.7 以降では、mysql_reset_connection ステートメントを使用してリソースを再初期化できます。 クエリキャッシュ 接続すると、データベースに接続され、ステートメントを実行できるようになります。 ステートメントを実行すると、MySQL はまずキャッシュを照会して、そのステートメントが以前に実行されたかどうかを確認します。MySQL は、以前に実行されたステートメントと結果をキー値の形式で保存します (もちろん、一定の保存期間と有効期間があります)。キャッシュが存在する場合は、キャッシュされた結果が直接返されます。 キャッシュワークフローは
もちろん、このテーブルが変更されると、このテーブルを使用しているすべてのキャッシュは有効ではなくなり、クエリ キャッシュ エントリはクリアされます。したがって、繰り返し変更されるテーブル内のステートメントをキャッシュすることは不適切です。キャッシュはいつでも有効になるため、クエリ キャッシュのヒット率が大幅に低下し、コスト効率があまり良くありません。 このテーブルにデータが書き込まれているとき、このテーブルのキャッシュ (ヒット キャッシュ、キャッシュ書き込みなど) は無効になります。Innodb では、トランザクションがこのテーブルを変更すると、トランザクションがコミットされる前にこのテーブルのキャッシュは無効になります。このトランザクションがコミットされる前は、このテーブルの関連クエリをキャッシュすることはできません。 一般的に、静的なテーブルやほとんど変更されないテーブルであればキャッシュすることができ、ヒット率は非常に高くなります。 キャッシュをいつ使用するかについて話しましょう。キャッシュをオンにするとシステムのパフォーマンスが向上するかどうかを測定するのは難しいトピックです。
アナライザ クエリ キャッシュが無効であるか、キャッシュが存在しない場合、MySQL サーバーはアナライザを使用してステートメントを分析します。アナライザはパーサーとも呼ばれます。 MySQL アナライザは 2 つの部分から構成されます。最初の部分は字句解析に使用され、文字ストリームをスキャンし、単語形成規則に従って単語を識別します。MySQL は Flex を使用して字句スキャナを生成します。MySQL キーワードと関数キーワードは sql/lex.h で定義され、2 つの配列に格納されます。2 番目の部分の機能は構文解析です。字句解析に基づいて、単語シーケンスが文法フレーズに結合され、最終的に構文ツリーが生成されてオプティマイザに送信されます。構文アナライザは Bison を使用し、sql/sql_yacc.yy で構文規則を定義します。次に、リレーショナル代数理論に従って構文ツリーを生成します。 上記のアナライザーの説明は公式的すぎて複雑です。実際には、アナライザーは主に「字句解析」を実行し、データベースステートメントが何を実行しているのか、それが何を意味するのかを理解するために使われます。 この時点で、アナライザーがこのステートメントに問題があることを検出した場合、エラー 1064 (42000): SQL構文にエラーがありますなどのエラーが報告されます。 オプティマイザ アナライザーが分析を終了し、ステートメントの動作を把握したら、次のステップは専用のオプティマイザーを使用してステートメントを最適化することです。オプティマイザーのタスクは、SQL クエリを実行するための最適なソリューションを見つけることです。 MySQL クエリ オプティマイザーを含むほとんどのクエリ オプティマイザーは、すべての可能なクエリ評価シナリオの中で、多かれ少なかれ最適なレベルまで検索します。 オプティマイザーは主に、オーバーヘッドを削減し、実行効率を向上させるように設計された最適な実行プランを選択します。 MySQL オプティマイザーは、最適な実行プランを生成するために多くの最適化戦略を使用する非常に複雑なコンポーネントです。
MySQL が進化するにつれて、オプティマイザが使用する最適化戦略も常に進化しています。ここでは、非常に一般的でわかりやすい最適化戦略をいくつか紹介します。 アクチュエータ アナライザーがステートメントが何を行うべきかを認識し、オプティマイザーがその実行方法を認識した後、次のステップは実行であり、エグゼキュータに引き渡されます。 実行時に、エグゼキュータはまず、ユーザーがテーブルの実行権限を持っているかどうかを判断します。権限がない場合は、拒否などのエラー メッセージが返されます。 権限がある場合は、テーブルが開かれ、実行が続行されます。テーブルを開くとき、エグゼキュータはテーブルに定義されているエンジンに基づいてエンジンのインターフェースを使用します。 最後に、ステートメントが実行され、データが取得されてクライアントに返されます。 要約する MySQL が SQL ステートメントを取得した後の一般的なプロセスは次のようになります。 0. コネクタはクライアントとの通信を担当します 1. キャッシュをクエリする: まずキャッシュをクエリして、kvキャッシュがあるかどうかを確認します。 2. パーサー: SQLの解析と転送を担当 3. プリプロセッサ: 解析されたSQLツリーを検証する 4. オプティマイザー: 実行プランを取得する 5. クエリ実行エンジン: エグゼキュータはステートメントを実行してデータ結果セットを取得します。 6. データを呼び出し元に返します。 さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: Vueソースコード解析における仮想DOMの詳しい説明
>>: WIN2008 サーバーのコマンド ラインを使用して IIS7 コンポーネントをインストールおよびアンインストールする方法
dig - DNS ルックアップ ユーティリティドメイン名のアクセス障害が発生した場合、ドメイン名の...
今日は、MySQL データベースと SQL 標準 (および他のデータベース) の UPDATE ステ...
iframeを更新する方法1. 更新するには、JavaScriptのdocument.fr.loca...
CentOS7 のデフォルトのデータベースは mariadb ですが、mysql を使っている人も多...
この記事の例では、JavaScriptで等速アニメーションを実装するための具体的なコードを参考までに...
<テンプレート> <div class="アプリコンテナ"&...
インターネットで見つけた方法は効果的ですinclude によって導入されたフッター ファイルとヘッダ...
目次1. typeof演算子2. インスタンスオブ演算子3. typeof と instanceof...
1.1 はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメ...
目次概要ブロブBlob の動作BLOB ダウンロード ファイルブロブ画像のローカル表示BLOB ファ...
目次SQL文を挿入する前にレコードが既に存在するかどうかを確認するSQL挿入時の判断の簡単なコレクシ...
アンインストールまず、次のコマンドを使用して、httpd サービスがインストールされているかどうか、...
1. ホットリンクの原則1.1 Webページの準備Web ソース ホスト (192.168.153...
今日は、ローカルの Docker プロジェクト イメージを dockerhub に公開する方法を紹介...
JavaScript を使用して Web ページ クロックを実装します。効果は次の図に示されています...