MySQL SELECT文の実行方法

MySQL SELECT文の実行方法

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 の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL 選択最適化ソリューションに関する簡単な説明
  • MySQL で結果を選択して更新を実行する例のチュートリアル
  • MySQLの読み書き分離により挿入後にデータが選択されなくなる問題を解決
  • MySQL で distinct メソッドを使用する詳細な例
  • MySQL で重複を削除するには、distinct または group by を使用する必要がありますか?
  • MySQL における distinct と group by の違い
  • MySQLのLIMIT文について詳しく説明します
  • union (all) と limit および exists キーワードの使用法を理解するための MySQL シリーズチュートリアル
  • MySQL のクエリパフォーマンスに対する制限の影響
  • MySQL での select、distinct、limit の使用

<<:  js における浅いコピーと深いコピーの詳細な説明

>>:  アイデアを使用して Springboot 初期化サーバーを構築する際の問題分析

推薦する

HTML テーブルタグチュートリアル (35): 列間属性 COLSPAN

複雑なテーブル構造では、一部のセルが垂直方向に複数のセルにまたがるため、列間属性 COLSPAN を...

npm 淘宝ミラー変更説明

1. トップレベルの使用法1. cnpmをインストールする npm i -g cnpm --regi...

フロントエンドは画像を遅延ロードする方法を知っている必要があります(3つの方法)

目次1. 遅延読み込みとは何ですか? 2. 遅延読み込みを実装する🌄: 2.1 最初の方法: 2.2...

動的テーブルを実装するための要素サンプルコード

目次【コード背景】 【コード実装】 #1# -> コード再利用の基本は、再利用可能なコンポーネ...

JSはスネークゲームを実装する

目次1. 初期化構造2. 蛇の色のレンダリング3. ヘビの動き4. ヘビの死を判定する方法 ヘビの死...

Vue を使用して CSS トランジションとアニメーションを実装する方法

目次1. トランジションとアニメーションの違い2. Vueを使用して基本的なCSSトランジションとア...

vscode で Prettier Code プラグインを使用する詳細なチュートリアル

なぜprettierを使うのですか?大企業では、フロントエンド開発コードに独自のコード標準がある場合...

MySQLワームレプリケーションの基本知識

ワームは、その名前が示すように、自ら複製し、その数は倍増、つまり指数関数的に増加します。 MySQL...

Vue で PC アドレスをモバイル アドレスにリダイレクトする方法

要件:PC側とモバイル側は2つの独立したプロジェクトです。2つのプロジェクトの内容は基本的に同じで、...

IntelliJ IDEA に Docker プラグインをインストールする詳細な手順 (2018 バージョン)

目次1. 開発環境2. dockerプラグインをインストールする1. アイデアのインストール2. イ...

タイムライン効果を実現するCSS3

最近、コンピューターの電源を入れたところ、Geek Academy が新規ユーザーに 1 か月の無料...

Linux の vsftpd サービス構成の簡単な分析 (匿名、ユーザー、仮想ユーザー)

vsftpd の概要vsftpd は「very secure FTP daemon」の略称で、セキ...

Linux centos7 環境での MySQL インストール チュートリアル

Linux centos7 環境に MySQL をインストールする手順の詳細な紹介MySQLをインス...

MySQL サービスを起動できない問題の解決策を含む MySQL 5.7.17 インストール チュートリアル

.net 開発に関しては、Microsoft の SQL Server データベースに精通しており、...

UbuntuにProtobuf 3をインストールするための詳細なチュートリアル

いつインストールするかprotoc コマンドを使用しても Protoc が見つからない場合は、インス...