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)が整理されています
テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...
1. コマンドの紹介contab (cron テーブル) コマンドは、Windows のスケジュール...
目次キャンバス関連文書エフェクト画像表示ケースの完全なコード親コンポーネントコードサブコンポーネント...
この記事では、jsネイティブウォーターフォールフロープラグインの具体的なコードを参考までに共有します...
ユーザーがログアウトした後、ブラウザの戻るボタンがクリックされると、Web アプリケーションは保護さ...
1. vue uiでプロジェクトを作成する 2. 基本設定項目を選択する 3. プロジェクトを実行す...
SSL 証明書の使用についてはここでは説明しません。SSL 証明書を導入する必要がある友人は、すでに...
序文実際には、次のような問題に遭遇する可能性があります。特定のレコードの ID がわかっていて、その...
以前の就職面接で面接官が尋ねた質問を覚えています。「インライン要素とは何ですか。ブロックレベル要素と...
目次1. リソースファイル2. インストール2.1 詳細な手順2.1.1 ディスクイメージのマウント...
目次1. ノードをインストールする2. Commander.jsをインストールする3. JavaSc...
目次1. シグナルリスト1.1. リアルタイム信号と非リアルタイム信号1.2 信号ステータス1.3 ...
導入この章では、主に Linux で FTP サーバーを構築するプロセスを紹介します。習得すべき重要...
この記事では、Centos7.3でのmysql5.7.18のインストールと初期パスワードの変更につい...
目次1. 画像を取得する2. ブローカーサーバーを作成する3. ブローカーを作成する4. Rocke...