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)が整理されています
目次01 レプリカセットアーキテクチャ02 MySQL Shellの紹介とインストール03 My...
企業が Docker 自動デプロイメントを構築する場合、Docker の実行時にコンテナ内の設定ファ...
カルーセルアニメーションは、ページの外観とインタラクティブなパフォーマンスを向上させることができます...
1|0 背景プロジェクトの要件により、各月の履歴在庫データをアーカイブしてバックアップする必要があり...
私たちが構築しようとしていたウェブサイトには、長い文章だけでなく、多数の表も含まれており、表のレイア...
Vue でのコードの再利用により、mixnis が提供されます。テンプレートの再利用により、スロット...
1. 機能紹介sed (Stream EDitor) は、コンテンツを 1 行ずつ処理するストリーム...
目次JS スリーマウンテンズ同期 非同期同期と非同期の違い範囲、終了関数スコープチェーンブロックスコ...
<br />このタグは、さらにテキストを入力できる複数行のテキスト フィールドを作成する...
まず効果図を見てみましょう: 完全なコードは添付されています <テンプレート> <...
インターフェースの役割:インターフェース (英語: interface) の機能は、簡単に言えば、コ...
コンピューターにmyeclipse2017とidea2017がインストールされているため、ideaが...
目次要件: 進行中のアクティビティ データを照会する次のSQLクエリは、上記の4つの要件を満たし、タ...
この記事では、CSS ::markerの興味深い疑似要素を紹介します。これを使用すると、テキスト番号...
序文CSS で水平方向と垂直方向に中央揃えする方法はたくさんあります。この記事で紹介する方法は非常に...