MySQL Select ステートメントはどのように実行されますか? 最近、Geek Time で Ding Qi 氏の「MySQL 45 Lectures」を視聴しました。本当に素晴らしい講義だと思いました。MySQL で得た経験の一部を皆さんと共有したいと思います。興味のある学生は、関連コースを購入して学習することができます。 本日ご紹介したいのは、select と update の実行プロセスです。 選択の実行プロセス さっそく、素晴らしい絵(自分で描いたもの)をご紹介します。 まず、SELECT ステートメント全体が、クライアントと MySQL を含む 3 つのモジュールで構成されていることがわかります。MySQL は、サーバー側とストレージ エンジン側で構成されています。サーバー側には、コネクタ、クエリ キャッシュ、アナライザ、オプティマイザ、エグゼキュータなどの部分が含まれます。ストレージ エンジン側には、innodb、Myisam、メモリなどの複数のストレージ エンジンも含まれます。 各モジュールの機能は次のとおりです。 コネクタ: コネクタのタスクは、クライアントとの接続を確立し、権限を照会し、接続を維持および管理することです。コマンドラインを使用してログインする場合、パスワードまたはアカウントが間違っていると、コネクタはアクセス拒否エラーを返します。正しいアカウントとパスワードで MySQL にログインすると、コネクタは現在のアカウントのログイン権限を照会します。その後のすべての操作はこの権限に依存します。
クライアントが MySQL に接続した後に何の操作も実行しない場合、コネクタは wait_timeout パラメータで設定された時間後に接続を切断します。プログラムでは長い接続を使用することをお勧めします。これにより、クライアントと MySQL との接続を確立することによって発生するパフォーマンスの低下を軽減できます。 クエリ キャッシュ: クライアントがSQLを入力すると、クエリキャッシュにヒットした場合、MySQLはその後の一連の分析操作を実行せずに結果を直接返します。ヒットしなかった場合は、アナライザ-オプティマイザ-エグゼキュータのプロセスを開始します。クエリ キャッシュに関して注意すべき点があと 2 つあります。 a. クエリ キャッシュのヒット率は一般的に低く、デメリットがメリットを上回るため、MySQL 8.0 ではクエリ キャッシュは使用されなくなりました。 b. 同時実行性の高いシナリオでは、クエリ キャッシュをオフにすることをお勧めします。オフにする場合は、query_cache_type=off または query_cache_size=0 を使用します。 c. この関数を使用する必要がある場合は、パラメータ query_cache_type を DEMAND に設定できます。このようにして、select sql_cache * from table を使用してクエリ キャッシュの使用を強制できます。 アナライザ: クエリが実際にクエリ キャッシュにヒットしない場合は、アナライザー ステージに入る必要があります。アナライザーの主な機能は、字句解析と構文解析です。 字句解析とは、SQL に基づいて選択、更新、変更、列名、テーブル名、ライブラリ名などを解析することを指します。 構文解析とは、記述した SQL が MySQL 構文に準拠しているかどうかを解析することを指します。満足できない場合は、「xxx エラーが発生しています」というプロンプトが表示されます。 オプティマイザ: オプティマイザの役割は、SQL 実行に最適なパスを選択することです。たとえば、複数のテーブルを結合する場合、オプティマイザは結合クエリを実行するための最も効率的なソリューションを選択します。ここに例があります。たとえば、(a, b) の結合インデックスを作成します。 a=1かつb=1のテーブルから*を選択します。 b=1かつa=1のテーブルから*を選択します。 これら 2 つの SQL ステートメントは同等です。オプティマイザーが次のステートメントを上記のステートメントに変換し、検索クエリに結合インデックスを適用するためです。 アクチュエータ: SQL がオプティマイザを通過した後、エグゼキュータに入ります。SQL を実行する前に、テーブルの権限を確認する必要があります。権限がある場合は、テーブルのストレージ エンジン定義に従ってストレージ エンジンが提供するインターフェイスを使用し、最終的にデータをクライアントに返して、新しい接続を待機し始めます。 ここで注意すべき点は、エグゼキュータが 1 回呼び出され、エンジン内で複数の行がスキャンされることです。したがって、ストレージ エンジンによってスキャンされる行数は、rows_examined とまったく同じではありません。 質疑応答 Q1: オプティマイザーの前に権限チェックが行われないのはなぜですか? A1: SQL 文で操作するテーブルは、SQL 文内のテーブルだけではない場合があります。たとえば、トリガーがある場合、それは実行段階(プロセス)でのみ判断できます。最適化段階の前には何もできない Q2: MySQL の権限はどこで検証されますか? A2: アカウントのログイン権限はコネクタモジュールで検証されます。テーブルの操作権限は2つのケースに分かれています。クエリキャッシュにヒットした場合は、クエリキャッシュが結果を返すときに、オプティマイザの前に検証されます。インデックスにヒットしない場合は、エグゼキュータモジュールで権限検証が検証されます。 上記は、MySQL Select ステートメントの実行方法の詳細です。MySQL Select ステートメントの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
>>: アイデアを使用して Springboot 初期化サーバーを構築する際の問題分析
目次1. はじめに2. RC および RR 分離レベル2.1. RRトランザクション分離レベルでのク...
日々の開発経験と関連するオンライン情報に基づいて、アダプティブとレスポンシブの違いをシンプルでわかり...
効果図は以下のとおりです。 <!DOCTYPE html> <html lang=...
この記事の例では、クールなフロントエンドページのスライド検証の具体的なコードを参考までに共有していま...
目次行と列の変換トランスクリプトの構成を分析するvue3 + el-table で作成されたトランス...
目次概要4つの例例1: 誕生日で説明する約束の基本例2: 数字当てゲーム例3: Web APIから国...
2048ミニゲーム、参考までに具体的な内容は以下のとおりですまず、2048ゲームは16のグリッドか...
<br />原文: http://andymao.com/andy/post/102.h...
最近、センタリングの問題に数多く遭遇したので、後で簡単に見つけられるように、時間をかけてそれらを要約...
目次1. 次のように、「rpm -ivh インストール パッケージ」コマンドを使用して rpm パッ...
数字で始まる次の CSS クラス名は有効になりません。 .1番目{ 色: 赤; }有効な CSS ク...
この記事の例では、参考までに簡単な虫眼鏡効果を実現するためのjsの具体的なコードを共有しています。具...
1. CSS 方法論とは何ですか? CSS methodologiesデザイン パターンまたは CS...
Remレイアウトの適応Vant のスタイルでは、デフォルトで px を単位として使用します。rem ...
序文以前の非MKレコードを再編成するためのMySQLの学習説明する有効になっていない場合、データベー...