MySQL の InnoDB ストレージ エンジンの詳細な紹介 (コード例)
この記事では、MySQL の InnoDB ストレージ エンジンについて詳しく説明します (コード例)。必要な方は参考にしてください。
InnoDB は MySQL のストレージ エンジン層に属し、プラグインの形式でデータベースに統合されます。 MySQL 5.5.8 以降、InnoDB がデフォルトのストレージ エンジンになります。 InnoDB ストレージ エンジンはトランザクションをサポートしており、その設計目標は主に OLTP アプリケーション向けです。その主な機能には、トランザクションのサポート、高同時実行性をサポートする行ロック設計、外部キーのサポート、自動クラッシュ回復、クラスター化インデックス構成テーブル構造などが含まれます。 (関連する推奨事項: MySQL チュートリアル )
システム アーキテクチャ
InnoDB ストレージ エンジンは、メモリ プール、バックグラウンド スレッド、およびメモリ プールの 3 つの部分で構成されます。ディスクストレージ。
#スレッド
InnoDB はマルチスレッド モデルを使用し、バックグラウンドで複数の異なるスレッドがさまざまなタスクの処理を担当しますマスター スレッドマスター スレッドはコア バックグラウンド スレッドであり、主にバッファ プール内のデータをディスクに非同期に更新してデータの一貫性を確保します。ダーティ ページの更新、マージされた挿入バッファ、UNDO ページのリサイクルなどが含まれます。 IO スレッド InnoDB ストレージ エンジンでは、書き込み IO リクエストを処理するために非同期 IO (Async IO) が広く使用されており、IO スレッドのジョブは主にこれらの IO リクエストのコールバックを担当します。 。 スレッドのパージトランザクションがコミットされた後、トランザクションで使用されていた UNDO ログは不要になる可能性があるため、割り当てられ使用された UNDO ページをリサイクルするには、スレッドのパージが必要です。 InnoDB は複数のパージ スレッドをサポートしており、UNDO ページのリサイクルを高速化し、CPU 使用率を高め、ストレージ エンジンのパフォーマンスを向上させることができます。 ページ クリーナー スレッドページ クリーナー スレッドは、マスター スレッドのダーティ ページ更新操作を置き換えるために使用され、元のマスター スレッドの作業とユーザー クエリ スレッドのブロックを軽減することです。 、InnoDB ストレージ エンジンのパフォーマンスがさらに向上します。メモリ
InnoDB ストレージ エンジンのメモリ構造SHOW VARIABLES LIKE 'innodb_buffer_pool_size' コマンドを使用して、バッファ プール構成を表示します。
mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size' \G *************************** 1. row *************************** Variable_name: innodb_buffer_pool_size Value: 134217728 1 row in set (0.01 sec)
- #マスター スレッドは、REDO ログ バッファを毎秒 REDO ログ ファイルにフラッシュします
- # #各トランザクションがコミットされると、REDO ログ バッファは REDO ログ ファイルにフラッシュされます。
- REDO ログ バッファ プールの残りの領域が 1/2 未満になると、REDO ログ バッファはREDO ログ ファイルにフラッシュされます。ログ ファイルの作成
InnoDB ストレージ エンジンでは、メモリ管理が行われます。ヒープ方式で実行されるメモリと呼ばれる処理。一部のデータ構造自体のメモリを割り当てる場合、追加のメモリプールから適用する必要がありますが、この領域のメモリが不足する場合はバッファプールから適用されます。
InnoDB でサポートされているロックは次のとおりです:
##共有ロックと排他ロック- ##インテンション ロック
- レコード ロック
ギャップ ロック
自動インクリメント ロック
- インテンション共有lock : 特定の行の共有ロックを取得しようとしています
- 意図的排他ロック: 特定の行の排他ロックを取得しようとしています
トランザクション
ACIDトランザクションについて話すとき、トランザクションは OLTP としてのデータベースの最も重要な機能です。 ACID の特徴:- 原子性: トランザクションの最小作業単位 (すべて成功するかすべて失敗するか)
- 一貫性: 開始とトランザクションの終了 その後、データベースの整合性は破壊されません。
- 分離 (分離): 異なるトランザクションは相互に影響しません。4 つの分離レベルは RU (コミットされていない読み取り) です。 、RC (コミットされた読み取り)、RR (繰り返し読み取り)、SERIALIZABLE (シリアル化)
- Durability (耐久性): トランザクションが送信された後、データへの変更は、たとえトランザクションが送信されても永続的です。システム障害が失われることはありません
- Read Uncommitted Read
- Read Committed Read Committed
- Repeatable ReadRepeatable Read
- Serializable Serializable
- ダーティ リーディング
- Non-repeatable read
- ファントム リーディング
Repeatable ReadRepeatable Read
Repeatable Read、このレベルは、同じトランザクション内で同じレコードを複数回読み取った結果の一貫性を保証し、InnoDB ストレージ エンジンでのファントム読み取りと非繰り返し読み取りの両方を解決します。質問を読んでください。
InnoDB エンジンは、Next-Key Lock
を使用してファントム読み取りの問題を解決します。 Next-Key Lock
は、行ロックとギャップ ロックの組み合わせです。InnoDB がインデックス レコードをスキャンするとき、最初に行ロック (レコード ロック) をインデックス レコードに追加し、次にギャップを追加します。インデックス レコードの両側のギャップ。ギャップ ロックを追加すると、他のトランザクションはこのギャップ内のレコードを変更したり挿入したりできなくなります。
Serializable Serializable
Serializable はトランザクションを強制的にシリアルに実行することでファントム読み取りの問題を回避します。ただし、Serializable はデータの読み取り行ごとに実行されます。ロックされているため、多くのタイムアウトやロック競合の問題が発生する可能性があり、同時実行性が急激に低下するため、MySQL InnoDB での使用はお勧めできません。
#オープン トランザクション- BEGIN、BEGIN WORK、START TRANSACTION ## BEGIN コマンドを実行しても、実際には新しいトランザクションは開始されません。エンジン層 トランザクションは現在のスレッドにマークを設定するだけで、明示的に開かれたトランザクションを表します。
- START TRANSACTION READ ONLY
- MySQL サーバーがデータを変更する SQL を受信すると、そのトランザクションを直接拒否します。変更するとエラーが返されます。このエラーに対してはエンジン層には入りません。
- START TRANSACTION READ WRITE
- 現在のスレッドの読み取り専用ステータスが次の場合に、スーパー ユーザーが読み取り/書き込みトランザクションを開始できるようにします。真実。
- 一貫したスナップショットでトランザクションを開始
- ## トランザクションを開くと、エンジン層に入り、 readview
Undo ログ
- trx_t
- ) をグローバル トランザクション ID ジェネレーターに追加します。リンク リスト (
trx_serial_list
は、Undo をマークします。このトランザクションが UndoPage を 1 つだけ使用し、使用量が 3/4 ページ未満の場合は、これをマークします。ページは) のコミット トランザクション
TRX_UNDO_CACHED - です。条件が満たされず
insert undo
の場合、
TRX_UNDO_TO_FREEとしてマークされます。それ以外の場合、取り消しは更新取り消しであり、マークされます。
TRX_UNDO_TO_PURGEとして。
TRX_UNDO_CACHEDとマークされた取り消しは、エンジンによってリサイクルされます。
update undo - を
undo セグメント
undate undo を変更します。の
履歴リストに入れ、
rseg_history_len## をインクリメントします # (グローバル)。同時に、ページのTRX_UNDO_TRX_NO
を更新します。データが削除された場合は、delete_mark
をリセットし、
から - update_undo_list
から削除します。
trx_commit_in_memoryTRX_UNDO_CACHED
としてマークされている場合は、update_undo_cached
キュー## に追加します。 ##mtr_commit
(元に戻す/やり直しのログはパブリック バッファに書き込まれます) この時点で、ファイル レベルのトランザクションがコミットされます。この時点でクラッシュした場合でも、再起動後にトランザクションが送信されることが保証されます。次に行うことは、メモリ データ ステータスを更新することです ( ) -
から readview読み取り専用トランザクションでは、
readview
を変更するだけで済みます。 global リンク リストから削除し、 - trx_t
構造内の情報をリセットします。読み取り/書き込みトランザクションは、まずトランザクション ステータスを
読み取り専用トランザクションの場合は、直接返されますTRX_STATE_COMMITTED_IN_MEMORY
に設定し、すべての行ロックを解放し、rw_trx_list
、readview
からtrx_t
を削除する必要があります。グローバルreadview
リンク リストから削除されました。insert undo
がある場合は、ここで削除します。update undo
がある場合は、パージ スレッドを起動して、ゴミをクリーンアップします。 最後に、trx_t# の情報をリセットします。 ## 簡単にダウンロードできるように、トランザクションは
を使用してロールバックします。
-
##From
update undo と - insert undo
の間の最後の取り消しを検索し、この取り消しからロールバックを開始します
#update undo
の場合、削除対象としてマークされたレコードはクリーニング対象としてマークされ、更新されたデータは最も古いバージョンにロールバックされます。
insert undoの場合は、クラスター化インデックスとセカンダリ インデックスを直接削除します
すべての元に戻す操作がロールバックされたか、指定された元に戻す操作にロールバックされた場合は、元に戻すログを停止して削除します
インデックス
InnoDB エンジンは、インデックス構造として B ツリーを使用します。主キー インデックスのリーフ ノード データ フィールドには完全なフィールド データが格納され、非主キー インデックスのリーフ ノードには、そのフィールドを指す値データが格納されます。主キー。
上の図は、InnoDB メイン インデックス (データ ファイルでもあります) の概略図であり、リーフ ノードに完全なデータ レコードが含まれていることがわかります。このインデックスはと呼ばれます。クラスター化インデックス。 InnoDB のデータ ファイル自体は主キーによって集約されるため、InnoDB ではテーブルに主キーが必要です。明示的に指定されていない場合、MySQL システムはデータ レコードを一意に識別できるカラムを主キーとして自動的に選択します。列が存在しない場合、MySQL は InnoDB テーブルの主キーとして暗黙的なフィールドを自動的に生成します。このフィールドの長さは 6 バイトで、型は long です。
InnoDB の補助インデックス データ フィールドには、アドレスの代わりに、対応するレコードの主キーの値が格納されます。つまり、InnoDB のすべてのセカンダリ インデックスは、データ フィールドとして主キーを参照します。クラスター化インデックスの実装により、主キーによる検索が非常に効率的になりますが、補助インデックス検索ではインデックスを 2 回取得する必要があります。まず、補助インデックスを取得して主キーを取得し、次に主キーを使用して主キー内のレコードを取得します。索引。
以上がMySQL の InnoDB ストレージ エンジンの詳細な紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック

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

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

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

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

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

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

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

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