MySQL 学習のまとめ: InnoDB ストレージ エンジンのアーキテクチャ設計の予備的な理解

MySQL 学習のまとめ: InnoDB ストレージ エンジンのアーキテクチャ設計の予備的な理解

1. ストレージエンジン

前のセクションでは、SQL 実行プランは、エグゼキュータ コンポーネントがストレージ エンジン インターフェイスを呼び出すことによって完了することを説明しました。
すると、次のことがわかります。MySQL データベース管理システムは、データを保存するディスク ファイルと対話するためにストレージ エンジンに依存しています。

では、MySQL にはどのようなストレージ エンジンがあるのでしょうか?

主なものとしては、MyISAM、InnoDB、Memory などがあります。さて、InnoDB ストレージ エンジンはインターネット上で基本的に使用されているため、次に InnoDB ストレージ エンジンについての学習内容を簡単にまとめ、InnoDB ストレージ エンジン内のコンポーネントを簡単に紹介します。

バッファプール

データベースのデータはディスク ファイルに保存されることは誰もが知っています。
では、毎回ディスク ファイル内で直接テーブルを追加、削除、変更、クエリするのでしょうか?

答え: いいえ!

ディスク ファイルのランダム読み取りおよび書き込みパフォーマンスは非常に低いため、すべての操作をディスク上で実行すると、高性能な MySQL は存在せず、MySQL は高い同時実行性をサポートできず、インターネット上でそれほど人気が​​なくなります。

このとき、InnoDB ストレージ エンジンの最も重要なコンポーネントは、非常に重要なメモリ構造である緩沖池(Buffer Pool)です。これはメモリ内にあり、メモリの読み取りと書き込みのパフォーマンスが非常に高いため、MySQL は高い同時実行性をサポートできます。

バッファプールの使用原則:

まず、MySQL がリクエストを受信するプロセスを確認しましょう。

①. MySQLワーカースレッドは、データベース接続プールの接続を具体的に監視し、接続がある場合は接続内のSQL文を取得します。
②その後、SQL文はSQL 接口に渡されて処理され、SQLインターフェースでは以下の一連の処理が行われます。
③.查詢解析器SQL ステートメントを MySQL が理解できる形式に解析します。
④.查詢優化器、SQL ステートメントに最適な実行プランを作成します。
⑤.執行器実行プランに従ってストレージエンジンインターフェースを呼び出します。

上記は前回の記事の要約です。では、ストレージ エンジン インターフェイスは、追加、削除、変更、クエリをどのように実行するのでしょうか。更新操作を例に挙げると、他の操作も同様です。
まず、ストレージ エンジンは、更新 SQL に対応するデータ行が緩沖池(Buffer Pool)内にあるかどうかを判断します。存在する場合は、緩沖池(Buffer Pool)内で直接データを更新して返します。存在しない場合は、ディスク ファイルから緩沖池(Buffer Pool)にデータを読み込んで更新操作を実行し、最後に結果を返します。

3. ログファイルの元に戻す

トランザクションでは、トランザクションがコミットされる前であればいつでもデータの更新をロールバックできることは誰もが知っています。では、これを実行するために何を頼りにするのでしょうか?

undo 日志文件に依存します。

UNDO ログ ファイルの使用原則:

データの更新を例に挙げます。
id=100 のデータ行を更新し、フィールド名を「Zhang San」から「Li Si」に変更すると、2 つのキー情報「id=10」と「name=Zhang San」がundo 日志文件に書き込まれます。
トランザクションをコミットする前にロールバックする必要がある場合は、 undo 日志文件でこれらの 2 つのキーワードを見つけて、更新操作をロールバックします。

4. REDOログバッファ

前述のように、すべての追加、削除、変更、およびクエリ操作は実際にはバッファー プールで実行されるため、データの変更はディスク ファイルにすぐには反映されません。

そこで疑問が生じます。バッファ プール内のダーティ データがディスク ファイルにフラッシュバックされる前に MySQL がクラッシュしたらどうなるでしょうか。
このとき、InnoDB ストレージ エンジンは、 redo log bufferコンポーネントという非常に重要なコンポーネントを提供します。これはメモリ内のバッファでもあります。

REDOログバッファの使用原則:

上記の更新操作を例にとると、データが更新されると、データ更新のキー情報が記録され、それがREDOログに対応してredo log bufferに書き込まれます。

しかし、まだ問題があります。前述のように、 redo log bufferもメモリ内にあります。 MySQL がクラッシュすると、メモリ内のすべてのデータが失われるため、バッファ プール内のダーティ データとredo log buffer内のログも失われます。
この結果、クライアントは更新成功メッセージを受け取りますが、データベース内のデータは依然として正常に更新されないという状況が発生します。

したがって、 redo log bufferもディスク フラッシュ戦略があります。通常、トランザクションがコミットされると、 redo log buffer内のredo 日志ディスクにフラッシュバックされるため、トランザクションは正常にコミットされたが更新データが失われる可能性があるという問題を心配する必要はありません。緩沖池(Buffer Pool)内のダーティ データがディスクにフラッシュバックされる前に MySQL がクラッシュした場合でも、MySQL が再起動すると、ディスク上のredo 日志に基づいてダーティ データの以前の更新をすべて復元できるため、データは失われません。

要約する

以上が編集者が紹介したMySQL学習のまとめであり、InnoDBストレージエンジンのアーキテクチャ設計の予備的な理解です。お役に立てれば幸いです。

以下もご興味があるかもしれません:
  • MySQL 20 の高性能アーキテクチャ設計原則 (収集する価値あり)
  • MySQLアーキテクチャ設計の詳細

<<:  uniapp プロジェクトをデスクトップ アプリケーションとしてパッケージ化する方法

>>:  Ckeditor + Ckfinderを使用したJavaScriptファイルアップロードケースの詳細な説明

推薦する

Vue2とVue3のライフサイクルの比較の詳細な理解

目次サイクル比較使用法要約するサイクル比較ヴュー2ヴュー3作成前設定作成された設定マウント前マウント...

Webpack4プラグインの実装原理についての簡単な説明

目次序文知る練習すれば完璧になる序文wabpack では、ローダーの他にプラグインがコア機能です。プ...

Vueはツリーテーブルを実装する

この記事では、ツリーテーブルを実装するためのVueの具体的なコードを例として紹介します。具体的な内容...

QQtabBar による CSS 命名仕様 BEM の詳細な紹介

QQtabBar の BEMまず、BEMとはどういう意味でしょうか? BEM は、ブロック、要素、修...

MySQLデータベースのロック機構の分析

同時アクセスの場合、非反復読み取りやその他の読み取り現象が発生する可能性があります。高い同時実行性に...

CentOS8 で MySQL 8.0 をインストールしてデプロイする方法

MySQL 8 の公式バージョン 8.0.11 がリリースされました。公式発表によると、MySQL ...

カスタム Docker イメージを作成するための Dockerfile の詳細な説明と CMD と ENTRYPOINT 命令の比較

1. 概要Docker イメージを作成するには、次の 3 つの方法があります。 Docker コミッ...

シンプルなプログレスバーを作成するための HTML+CSS

1. HTMLコードコードをコピーコードは次のとおりです。経験値: <span class=...

VUE+Canvasはデスクトップピンボールブロック破壊ゲームのサンプルコードを実装します

誰もがピンボールやレンガ崩しのゲームをプレイしたことがあるでしょう。左と右のキーを使用して、下にある...

LinuxはNetworkManagerを使用してMACアドレスをランダムに生成します

今では、自宅のソファーに座っていても、外の喫茶店にいても、ノートパソコンの電源を入れてWi-Fiに接...

sbinディレクトリを生成せずにNginxをインストールするソリューション

エラーの説明: 1. Linux (CentOS 7 64) システムに Nginx (1.18.0...

Linux sshのデフォルトのリモートポート番号を変更する6つの手順

Linux のデフォルトの ssh リモート ポートは 22 です。デフォルトのポートは、悪意のある...

CocosCreatorで複数のタイマーを使用する方法の詳細な説明

1.タイムアウトを設定する3 秒後に abc を印刷します。一度だけ実行します。 setTimeou...

JavaScript の実行コンテキストとコールスタックの詳細な説明

目次1. 実行コンテキストとは何か2. 実行コンテキスト スタックとは何ですか? 3. 実行コンテキ...

Vue プロジェクトで SVG コンポーネントをパッケージ化して構成する手順

最近新しい会社に入社しました。プロジェクトに携わった後、タイトルアイコンが svg で作られていると...