1. プロセス2. コアアーキテクチャ
2.1 サーバー層の基本コンポーネントの紹介1. コネクタ コネクタは、高レベルのドアマンのように、主に認証と権限関連の機能に関係します。
クエリ キャッシュは主に、実行した SELECT ステートメントとステートメントの結果セットをキャッシュするために使用されます。
3. アナライザー
4. オプティマイザー
5. アクチュエータ
3. ステートメント分析3.1 クエリステートメント
select * from tb_student A where A.age='18' and A.name=' 张三'; 上記の説明と組み合わせて、このステートメントの実行フローを分析します。 まず、ステートメントに権限があるかどうかを確認します。権限がない場合は、直接エラー メッセージが返されます。権限が付与されている場合、MySQL 8.0 より前では、まずキャッシュが照会され、この SQL ステートメントをキーとして使用して、メモリ内に結果があるかどうかが確認されます。結果がある場合は、キャッシュが直接キャッシュされます。結果がない場合は、次の手順に進みます。 アナライザーを通じて、字句解析が実行され、SQL ステートメントのキー要素が抽出されます。たとえば、上記のステートメントはクエリ選択であり、クエリ対象のテーブル名は tb_student であり、すべての列をクエリする必要があり、クエリ条件はこのテーブルの ID = '1' です。次に、キーワードが正しいかどうかなど、SQL ステートメントに構文エラーがないか確認します。チェックが OK の場合は、次の手順に進みます。 次のステップは、オプティマイザが実行プランを決定することです。上記の SQL ステートメントには、次の 2 つの実行プランがあります。 a. まず、学生テーブルで「Zhang San」という名前の学生を検索し、その年齢が 18 歳かどうかを判断します。 次に、オプティマイザーは独自の最適化アルゴリズムに基づいて、実行効率が最も高いソリューションを選択します (オプティマイザーは、これが常に最適なソリューションであるとは限らないと考えています)。実行プランを確認したら、実行を開始する準備が整います。 権限チェックを実行します。権限がない場合はエラーメッセージが返されます。権限がある場合は、データベースエンジンインターフェイスが呼び出され、エンジンの実行結果が返されます。 3.2 更新ステートメント上記はクエリSQLの実行プロセスですが、更新文がどのように実行されるかを見てみましょう。 SQL ステートメントは次のとおりです。 張三の年齢を変更しましょう。実際のデータベースでは、この年齢フィールドは絶対に設定されません。そうしないと、テクニカルディレクターに殴られてしまいます。実際、このステートメントは基本的に前のクエリのプロセスに従いますが、更新を実行するときにログを記録する必要があるため、ログモジュールが導入されます。 MySQLの組み込みログモジュールはbinlog(アーカイブログ)であり、すべてのストレージエンジンで使用できます。 私たちがよく使用するInnoDBエンジンにも、ログモジュールredo log(リドログ)が付属しています。 InnoDBモードでのこのステートメントの実行プロセスについて説明します。プロセスは次のとおりです。 まず、Zhang San のデータをクエリします。キャッシュがある場合は、それも使用されます。 次に、クエリ ステートメントを取得し、年齢を 19 に変更し、エンジン API インターフェイスを呼び出してこのデータ行を書き込みます。InnoDB エンジンはデータをメモリに保存し、REDO ログを記録します。この時点で、REDO ログは準備状態になり、実行が完了し、いつでも送信できることをエグゼキュータに伝えます。 通知を受信した後、エグゼキュータはバイナリログを記録し、エンジン インターフェイスを呼び出して、REDO ログをコミット済み状態に送信します。 更新が完了しました。 ここで、生徒の中には、なぜ 2 つのログ モジュールが必要なのか、1 つのログ モジュールで済ませられないのかと疑問に思う人もいるでしょう。 これは、MySQL が当初 InnoDB エンジンと互換性がなかったためです (InnoDB エンジンは、他社によってプラグインとして MySQL に挿入されました)。MySQL のネイティブ エンジンは MyISAM ですが、REDO ログは InnoDB エンジン独自のものであり、他のストレージ エンジンにはないことがわかっています。このため、クラッシュ セーフ機能 (クラッシュ セーフ機能とは、データベースが異常に再起動しても、以前に送信されたレコードが失われない機能) がなく、binlog ログはアーカイブにしか使用できません。 1 つのログ モジュールのみを使用できないという意味ではありませんが、InnoDB エンジンは REDO ログを介したトランザクションをサポートします。すると、一部の学生は、2 つのログ モジュールを使用してもそれほど複雑にならないのかと疑問に思うかもしれません。なぜ redo ログで準備のコミット前ステータスを導入する必要があるのでしょうか。ここでは、なぜこれを行うのかを説明するために、背理法による証明を使用します。 まず、REDO ログを書き込んで直接コミットし、次に binlog を書き込みます。REDO ログを書き込んだ後にマシンがクラッシュし、binlog が書き込まれなかったとします。マシンが再起動すると、マシンは REDO ログを通じてデータを復元します。ただし、この時点では binlog にデータは記録されません。後でマシンをバックアップすると、このデータは失われます。同時に、マスター スレーブ同期でもこのデータは失われます。 最初に binlog を書き込み、次に redo log を書き込みます。binlog を書き込んだ後、マシンが異常に再起動したとします。redo log がないため、マシンはこのレコードを回復できません。ただし、binlog には別のレコードがあります。すると、上記と同じ理由でデータの不整合が発生します。 REDOログ2フェーズコミット方式を採用すると状況は異なります。binglogを書き込んだ後、REDOログを送信することで上記のような問題の発生を防ぎ、データの一貫性を確保できます。そこで疑問なのが、極端な状況が存在するかどうかです。 redo ログがコミット前の状態にあり、binglog が書き込まれているとします。このとき異常な再起動が発生するとどうなるでしょうか。 これは MySQL の処理メカニズムに依存します。MySQL の処理プロセスは次のとおりです。 REDO ログが完了しているかどうかを判断します。完了している場合は、すぐにコミットします。 REDO ログが事前コミット済みだがコミットされていない状態の場合、バイナリログが完了するとトランザクションはロールバックされます。 これにより、データの一貫性の問題が解決されます。 4. 結論
この記事はこれで終わりです。123WORDPRESS.COM の他のコンテンツにも注目していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: 12個のJavascriptテーブルコントロール(DataGrid)が整理されています
テキストオーバーフローを表示するにはどうすればいいですか? どのようなニーズがありますか?単一行です...
私が使用している VMware Workstation Pro のバージョンは次のとおりです。 1....
1. 一般的な使用法: (1)%で使用する% は 1 つ以上の文字のワイルドカードを表します。たとえ...
場合によっては、SQL ステートメントが通常どおり、非常に速く実行される状況に遭遇することがあります...
この記事では、MySQL データベースでよく使用される SQL ステートメントを例を使用して説明しま...
目次背景仮想ファイルのインポート例書類タイプスクリプトのサポート要約する背景新しいプロジェクトで v...
今日、非常に奇妙な状況に遭遇しました。docker イメージを更新した後、docker-compos...
1. 現在のすべての接続の詳細情報を表示します。 ./mysqladmin -uadmin -p -...
この記事では、ExcelファイルをMySQLデータベースにインポートする方法を参考までに紹介します。...
方法は2つあります: 1. サービス方法ファイアウォールのステータスを確認します。 [root@ce...
1. ファイル名検索を実行するwhich ('実行可能ファイル' を検索) //PA...
Linux が NFS サーバーを構築異なるオペレーティング システム間でデータを共有するために、通...
目次1. ルーティング関連オブジェクト2. ルーティングオブジェクトの場所3. ルーティング構成4....
この記事の例では、ふるい抽選を実装するためのミニプログラムの具体的なコードを参考までに共有しています...
スーパーバイザー紹介Supervisor は、Python で開発されたクライアント/サーバー サー...