mysqlの実行プロセスの分析

Jan 31, 2020 pm 05:33 PM
mysql

mysqlの実行プロセスの分析

MySQL は、サーバー層とストレージ エンジン層の 2 つの部分に分割できます。

サーバー層には、コネクタとストレージ エンジン層が含まれます。クエリ キャッシュ、アナライザー、オプティマイザー、エグゼキューターなど、MySQL のコア サービス関数とすべての組み込み関数のほとんどをカバーします。すべてのクロスストレージ エンジン関数 (ストアド プロシージャ、トリガー、ビューなど) はこの層に実装されます。

ストレージ エンジン層は、データの保存と取得を担当します。そのアーキテクチャ モデルはプラグインであり、InnoDB、MyISAM、Memory などの複数のストレージ エンジンをサポートします。現在最も一般的に使用されているストレージ エンジンは InnoDB

(無料学習ビデオ チュートリアルの推奨事項:

mysql ビデオ チュートリアル)

SQL 実行プロセスを見てみましょう

コネクタ

最初のステップでは、最初にデータベースに接続します。この時点でコネクタが受信します。コネクタは、クライアントとの接続の確立、権限の取得、接続の維持と管理を担当します。

接続が完了した後、その後何もアクションを行わない場合、接続はアイドル状態になります。

クライアントが長時間非アクティブな場合、コネクタは自動的にクライアントを切断します。この時間はパラメータ wait_timeout によって制御されます。デフォルト値は 8 時間です。

接続を確立するプロセスは通常複雑であるため、使用中は接続を確立するアクションを最小限に抑える必要があります。長い接続を使用する

ただし、長い接続をすべて使用した後、MySQL が占有するメモリが急速に増加することがあります。これは、MySQL が実行中に一時的に使用するメモリが接続オブジェクトで管理されるためです。これらのリソースは、接続が切断された場合にのみ解放されます

この問題を解決するには? 次の 2 つのオプションを検討できます。

1. 長い接続を定期的に切断します。一定期間使用した後、またはメモリを消費する大規模なクエリが実行されたとプログラムが判断した後、接続は切断され、クエリが必要になってから再接続されます。

2. MySQL 5.7 以降を使用している場合は、比較的大規模な操作を実行した後、毎回 mysql_reset_connection を実行することで接続リソースを再初期化できます。このプロセスでは再接続や権限の確認は必要ありませんが、接続が確立された後、接続は作成されたばかりの状態に復元されます。

クエリ キャッシュ

select ステートメントを実行できます。実行ロジックは 2 番目のステップであるクエリ キャッシュに進みます。 MySQL はクエリ リクエストを取得すると、まずクエリ キャッシュに移動して、このステートメントが以前に実行されたかどうかを確認します。以前に実行されたステートメントとその結果は、キーと値のペアの形式でメモリに直接キャッシュされる場合があります。キーはクエリ ステートメントであり、値はクエリの結果です。クエリがこのキャッシュ内でキーを直接見つけることができた場合、値はクライアントに直接返されます。

ステートメントがクエリ キャッシュにない場合は、後続の実行ステージが続行されます。実行が完了すると、実行結果はクエリ キャッシュに保存されます。クエリがキャッシュにヒットした場合、MySQL は後続の複雑な操作を実行せずに結果を直接返すことができることがわかります。この効率は非常に高くなります。

しかし、ほとんどの場合、クエリ キャッシュは使用されません。なぜですか? なぜなら?クエリ キャッシュは、多くの場合、利益よりも害の方が大きくなります。

クエリ キャッシュは非常に頻繁に失敗します。テーブルが更新されている限り、このテーブル上のすべてのクエリ キャッシュはクリアされます。そのため、せっかく結果を保存したのに、使用する前にアップデートによって消えてしまったという可能性もあります。更新圧力が高いデータベースの場合、クエリ キャッシュのヒット率は非常に低くなります。ビジネスに長期間のみ更新される静的テーブルがある場合を除き、

パラメータ query_cache_type を DEMAND に設定して、クエリ キャッシュがデフォルトの SQL ステートメントに使用されないようにすることができます

MySQL バージョン 8.0 では、クエリ キャッシュ関数全体が直接削除されます。つまり、この関数は 8.0 から完全に削除されます。

Analyzer

ヒットしない場合、ステートメントの実際の実行が開始されます。まず第一に、MySQL はユーザーが何をしたいのかを知る必要があるため、SQL ステートメントを解析する必要があります。

アナライザーは最初に「字句解析」を行います。入力したものは、複数の文字列とスペースで構成される SQL ステートメントです。MySQL は、その中の文字列が何であり、それが何を表しているのかを識別する必要があります。

これらの識別が完了したら、「構文解析」を行う必要があります。字句解析の結果に従って、構文アナライザーは、入力された SQL ステートメントが MySQL 構文を満たすかどうかを判断します。

Optimizer

アナライザーを通過すると、MySQL は何を認識しますかあなたがしたいこと。実行を開始する前に、オプティマイザによって処理する必要があります。

オプティマイザは、テーブルに複数のインデックスがある場合、またはステートメントに複数のテーブルの関連付け (結合) がある場合に、どのインデックスを使用するかを決定し、各テーブルの接続順序を決定します。

オプティマイザ フェーズが完了し、このステートメントの実行計画が決定され、次にエグゼキュータ フェーズに入ります。

executor

実行を開始するときは、まずこのテーブル T に対してクエリを実行する権限があるかどうかを判断する必要があります。権限がない場合は、権限がないというエラーが返されます。

権限がある場合は、テーブルを開いて、実行を継続します。テーブルが開かれると、エグゼキュータはエンジンによって提供されるインターフェイスを使用して、テーブルのエンジン定義に従って実行します。

この時点で、サーバー層は特定のエンジン層ロジックの実行を完了しています。次の記事で分析します

以上がmysqlの実行プロセスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのビッグデータ構造処理スキル PHPのビッグデータ構造処理スキル May 08, 2024 am 10:24 AM

ビッグ データ構造の処理スキル: チャンキング: データ セットを分割してチャンクに処理し、メモリ消費を削減します。ジェネレーター: データ セット全体をロードせずにデータ項目を 1 つずつ生成します。無制限のデータ セットに適しています。ストリーミング: ファイルやクエリ結果を 1 行ずつ読み取ります。大きなファイルやリモート データに適しています。外部ストレージ: 非常に大規模なデータ セットの場合は、データをデータベースまたは NoSQL に保存します。

PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? Jun 03, 2024 pm 08:11 PM

MySQL クエリのパフォーマンスは、検索時間を線形の複雑さから対数の複雑さまで短縮するインデックスを構築することで最適化できます。 PreparedStatement を使用して SQL インジェクションを防止し、クエリのパフォーマンスを向上させます。クエリ結果を制限し、サーバーによって処理されるデータ量を削減します。適切な結合タイプの使用、インデックスの作成、サブクエリの使用の検討など、結合クエリを最適化します。クエリを分析してボトルネックを特定し、キャッシュを使用してデータベースの負荷を軽減し、オーバーヘッドを最小限に抑えます。

PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? Jun 03, 2024 pm 12:19 PM

PHP で MySQL データベースをバックアップおよび復元するには、次の手順を実行します。 データベースをバックアップします。 mysqldump コマンドを使用して、データベースを SQL ファイルにダンプします。データベースの復元: mysql コマンドを使用して、SQL ファイルからデータベースを復元します。

PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? Jun 02, 2024 pm 02:26 PM

MySQLテーブルにデータを挿入するにはどうすればよいですか?データベースに接続する: mysqli を使用してデータベースへの接続を確立します。 SQL クエリを準備します。挿入する列と値を指定する INSERT ステートメントを作成します。クエリの実行: query() メソッドを使用して挿入クエリを実行します。成功すると、確認メッセージが出力されます。

MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 Dec 09, 2024 am 11:42 AM

MySQL 8.4 (2024 年時点の最新の LTS リリース) で導入された主な変更の 1 つは、「MySQL Native Password」プラグインがデフォルトで有効ではなくなったことです。さらに、MySQL 9.0 ではこのプラグインが完全に削除されています。 この変更は PHP および他のアプリに影響します

PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? Jun 02, 2024 pm 02:13 PM

PHP で MySQL ストアド プロシージャを使用するには: PDO または MySQLi 拡張機能を使用して、MySQL データベースに接続します。ストアド プロシージャを呼び出すステートメントを準備します。ストアド プロシージャを実行します。結果セットを処理します (ストアド プロシージャが結果を返す場合)。データベース接続を閉じます。

PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? Jun 04, 2024 pm 01:57 PM

PHP を使用して MySQL テーブルを作成するには、次の手順が必要です。 データベースに接続します。データベースが存在しない場合は作成します。データベースを選択します。テーブルを作成します。クエリを実行します。接続を閉じます。

Oracleデータベースとmysqlの違い Oracleデータベースとmysqlの違い May 10, 2024 am 01:54 AM

Oracle データベースと MySQL はどちらもリレーショナル モデルに基づいたデータベースですが、Oracle は互換性、スケーラビリティ、データ型、セキュリティの点で優れており、MySQL は速度と柔軟性に重点を置いており、小規模から中規模のデータ セットに適しています。 ① Oracle は幅広いデータ型を提供し、② 高度なセキュリティ機能を提供し、③ エンタープライズレベルのアプリケーションに適しています。① MySQL は NoSQL データ型をサポートし、② セキュリティ対策が少なく、③ 小規模から中規模のアプリケーションに適しています。

See all articles