第 2 章:
ストレージエンジン
MySQL ストレージ エンジンは実際には抽象クラスです。ファイル アクセス レイヤーの抽象インターフェイスは、ファイル アクセス メカニズムをカスタマイズするために使用されます。このアクセス メカニズムはストレージ エンジンと呼ばれます。MySQL を他のデータベースと区別する最も重要な機能は、プラグインです。ストレージ エンジン インターフェイス モジュール、プラガブル ストレージ エンジン内。
ストレージ エンジンは、MySQL 公式ストレージ エンジンとサードパーティ ストレージ エンジンに分類できます。
MySQL の公式および最も主流のストレージ エンジンには次のものがあります。
- MyISAMストレージエンジン
- InnoDBストレージ エンジン
- メモリストレージエンジン
- NDBストレージエンジン
- アーカイブストレージエンジン
MyISAM ストレージ エンジン (OLAP データベース アプリケーション用)
- ストレージ制限: 256TB
- トランザクションをサポートせず、MVCC (マルチバージョン同時実行制御) をサポートしません。
- ロック粒度:テーブルレベル
- サポートされているインデックスの種類: B ツリー インデックス、フルテキスト インデックス
- レプリケーションはサポートされます、外部キーはサポートされません、クエリキャッシュはサポートされます
- 高速アクセス速度、優れたインデックス最適化およびデータ圧縮テクノロジー
MyISAM ストレージ エンジン テーブルは、MYD と MYI で構成されます。MYDはデータ ファイルの格納に使用され、MYI はインデックス ファイルの格納に使用されます。
MySQL 5.0 より前では、MyISAM はデフォルトで 4 GB のテーブル サイズをサポートし、MySQL 5.0 以降では、256 TB の単一テーブル データをサポートします。
MyISAM バッファ プールはインデックス ファイルのみをキャッシュし、データ ファイルはキャッシュしません。
InnoDB ストレージ エンジン (OLTP データベース アプリケーション用)
- トランザクションのサポート、MVCC (マルチバージョン同時実行制御) のサポート
- ロックの粒度:行レベル
- サポートされているインデックス タイプ: B ツリー インデックス、アダプティブ ハッシュ インデックス、フルテキスト インデックス
- レプリケーションのサポート、外部キーのサポート、クエリ キャッシュのサポート
MyISAM と InnoDB の違い:
MyISAM はテーブルの合計行数を保存しますが、InnoDB はテーブルの合計行数を保存しません。
MyISAM のクエリ速度は InnoDB よりもはるかに高速です。
NDBストレージエンジン
NDB ストレージ エンジンは、クラスタ化されたストレージ エンジンです。
NDB の特徴は、すべてのデータがメモリ上に格納されるため、主キーの検索が非常に速く、可用性が高く高性能なクラスタシステムです。
ただし、テーブルの接続操作はストレージ エンジン層ではなく、MySQL データベース層で行われます。これは、複雑な接続操作には膨大なネットワーク オーバーヘッドが必要なため、複雑なクエリが遅くなり、NDB ストレージ エンジンがトランザクションをサポートしないことを意味します。
メモリストレージエンジン
メモリ ストレージ エンジンは、テーブル内のデータをメモリに保存します。データベースが再起動またはクラッシュすると、テーブル内のデータは消えます。
一時データの保存に適した一時テーブル。
メモリ ストレージ エンジンは非常に高速ですが、使用には依然として一定の制限があります。たとえば、テーブル ロックのみがサポートされ、同時実行パフォーマンスは低く、トランザクションはサポートされません。メモリ ストレージ エンジンは、デフォルトで B+ ツリー インデックスの代わりにハッシュ インデックスを使用します。
アーカイブストレージエンジン
アーカイブ ストレージ エンジンは、INSERT 操作と SELECT 操作のみをサポートします。zlib アルゴリズムを使用してデータ行を圧縮して保存すると、圧縮率は通常 1:10 に達します。
アーカイブ ストレージ エンジンは、ログ情報などのアーカイブ データの保存に非常に適しています。
アーカイブ ストレージ エンジンはトランザクションセーフではなく、その設計目標は主に高速な挿入および圧縮機能を提供することです。
エンジン改造
変換テーブルのストレージ エンジンは、元のストレージ エンジンに関連するすべての機能を失います。たとえば、InnoDB テーブルを MyISAM に変換してから InnoDB に戻すと、元の InnoDB テーブル上のすべての外部キーが消えます。
Innodb ストレージ エンジンのアーキテクチャ
- バッファプール
- バッファを変更する
- 適応型ハッシュインデックス
- REDOログバッファ
- 二重書き込み
MySQL は WAL を使用して、データベース トランザクションの一貫性と耐久性を確保します。具体的には:
- レコードを変更する前に、必ず最初に。
- トランザクションの送信プロセス中、トランザクションの送信が完了するように、ログが最初にディスクに配置されていることを確認する必要があります。
InnoDBバッファプール
InnoDB エンジンはバッファ プール テクノロジを使用して、データベースの全体的なパフォーマンス (速度) を向上させます。
InnoDB ストレージ エンジンにはさまざまなバッファ プールがあります。これらのバッファ ブロックは、大規模な InnoDB ストレージ エンジン メモリ プールを形成します。主なタスクは次のとおりです。
- すべてのプロセス/スレッドがアクセスする必要がある複数の内部データ構造を維持します。
- 高速読み取りのためにデータをディスクにキャッシュし、ディスク ファイルを変更する前にキャッシュします。
- REDOログキャッシュなど
Innodb エンジンのディスクとメモリ間のデータ対話の基本単位はデータ ページであり、デフォルトのサイズは 16KB です。
Innodb エンジンは、各キャッシュ ページに対応するブロック構造を作成し、そのブロック構造にはテーブル スペース番号やページのページ番号などの情報が格納されます。
データ ページは、LRU の最も最近使用されていないアルゴリズムを通じてスワップインおよびスワップアウトされます。
バッファプール関連のパラメータ
- innodb_buffer_pool_size : バッファプールの合計サイズ
- innodb_buffer_pool_instances : バッファ プール内のインスタンスの数 同時ロック競合の圧力を軽減するために、バッファ プールは複数のインスタンスに分割されます。
- innodb_buffer_pool_chunk_size : チャンクのサイズ、デフォルトは 128M Mysql5.7 バージョン以降、Innodb エンジンはチャンク構造を導入しました。バッファプール(拡張時)はオペレーティングシステムからの連続したメモリ空間の一部に適用されます。チャンク単位でオペレーティングシステムに適用されます。チャンクにはキャッシュページの制御ブロックやキャッシュページ、リンクリスト情報が格納されます。これらのキャッシュ ページを管理します。
- innodb_buffer_pool_dump_at_shutdown=ON は、MySQL のシャットダウン時に、メモリ内のホット データがディスク上の ib_buffer_pool ファイルに保存されることを意味します。
- innodb_buffer_pool_load_at_startup=ON は、起動時にホット データが Buffer_Pool バッファ プールに自動的にロードされることを意味します。このようにして、ホット データは常にメモリ内に保持されます。
InnoDBの変更バッファ
通常、セカンダリ インデックスは一意ではなく、挿入順序は非常にランダムで、更新と削除は隣接した位置にありません。変更バッファにより、多数のランダムI/O の生成が回避され、複数の操作が少数の I/O に変換されます。可能な限り /O 操作を行います。
変更バッファの関連パラメータ:
- innodb_change_buffering : キャッシュに対応する操作。
- innodb_change_buffer_max_size : バッファー プール内の変更バッファーの最大パーセンテージを構成するために使用されます。
InnoDB のアダプティブ ハッシュ インデックス
lnnoDB ストレージ エンジンは、テーブル上のセカンダリ インデックスのルックアップを監視します。セカンダリ インデックスへのアクセスが頻繁であることが判明した場合、セカンダリ インデックスはホット データとなり、ハッシュ インデックスの確立により速度向上が期待できる場合、ハッシュ インデックスが確立されるため、アダプティブ、つまり適応型と呼ばれます。ハッシュインデックス。MySQL は自動的に管理され、人間が介入することはできません。
適応型ハッシュ インデックスは、バッファ プールの B+Tree を通じて構築されます。
アダプティブ ハッシュ インデックスは lnnoDB バッファ プールを占有します。
この機能をオフまたはオンにするには、「set global innodb_adaptive_hash_index off/on」コマンドを使用します。
InnoDBのREDOログバッファ
REDO ログ バッファには、REDO ログ ファイルに書き込まれるデータが保存されます。そのサイズは を介して設定されます。
パラメータ:
- innodb_flush_log_at_trx_commit、REDO ログのフラッシュ頻度を制御します (0、1、2、セキュリティは低から高、パフォーマンスは高から低)
- innodb_log_buffer_size は、REDO ログ バッファのサイズを設定します。
InnoDBの二重書き込み
二重書き込み技術の導入により、データ書き込みの信頼性が向上します。シーケンシャル書き込みはランダム書き込みよりもコストが低くなります。欠点は、新しいタイプの SSD ストレージに繰り返し書き込みを行うと、SSD の寿命に大きな影響を与えることです。
パラメータ:
- innodb_doublewrite=0 : 二重書き込み機能をオフにする
トランザクションのコミット
トランザクションのコミット処理
ストレージ エンジンがトランザクションを実装する一般的な方法は、REDO ログと UNDO ログに基づいています。REDO ログにはトランザクションによって変更されたデータが記録され、Undo ログにはトランザクション前の元のデータが記録されます。
トランザクションが実行されるときに発生する実際のプロセス
- まず元に戻す/やり直しログを記録し、ログが永続的なストレージとしてディスクにフラッシュされることを確認します。
- データ レコードを更新し、操作をキャッシュし、ディスクを非同期的にフラッシュします。
- トランザクション ログを binlog に保存します。
- トランザクションをコミットし、REDO ログにコミット レコードを書き込みます。
binlog はトランザクション ストレージ エンジンの範囲内にないため、トランザクションがコミットされる前 (更新後、コミット前) にトランザクション ログを binlog に保存する必要があります。
トランザクションが送信された後
1. トランザクションが送信された後、元に戻すセグメントがパージされます。パージの主な機能は、実際に物理レコードを削除することです。(削除または更新操作が実行されるとき、実際の古いレコードは実際には削除されません(is_deleted と同様)。レコードにはマークが付けられますが、トランザクションがコミットされた後、パージ スレッドによって実際にレコードが削除されます。)
2.リソースのロックを解除する
3. REDO ログをブラシします。REDO ログの削除操作を通じてデータベースの整合性と一貫性を確保します。
4.セーブポイント リストをクリーンアップします。実際には、各ステートメントにはロールバック用のセーブポイントがあります。
InnoDB バックグラウンド スレッド
InnoDB バックグラウンド スレッドの主な機能は、メモリ プール内のデータを更新して、バッファ プール内のメモリ キャッシュが最新のデータであることを確認することです。
InnoDB メインスレッド
マスター スレッド:主なジョブは、ダーティ ページのリフレッシュ、バッファのマージと挿入などを含む、バッファ プール内のデータをディスクに非同期にリフレッシュしてデータの整合性を確保することです。
マスター スレッドは最も高いスレッド優先度を持ち、その内部は複数のループで構成されます。マスタースレッドは、データ操作の状態に応じて数サイクル間で切り替わります。
- バックグラウンドループ
- 無駄なUndoページを削除(常に)
- 一定量の挿入バッファーをマージします (常に)
- ユーザー アクティビティがある場合はメイン ループに戻り、そうでない場合は更新ループにジャンプします (常に)
- リフレッシュサイクル
- 一定数のダーティ ページをディスクにフラッシュします (常に)
- 一時停止ループにジャンプします (常に)
- 一時停止ループ
- マスタースレッドを一時停止する
- イベントが発生すると、メインループにジャンプします (常に)
InnoDB バックグラウンド I/O スレッド
AIO非同期 I/O は、 I/O リクエストを処理するためにInnoDB ストレージ エンジンで広く使用されており、データベースのパフォーマンスを大幅に向上させることができます。
読み取りスレッドは、ディスクからバッファ プールのページにデータをロードする役割を果たします。
書き込みスレッドは、バッファ プールのダーティ ページをディスクにフラッシュする役割を果たします。
ログ スレッドは、ログ バッファの内容をディスクにフラッシュする役割を果たします。
挿入バッファ スレッドは、変更バッファの内容をディスクにフラッシュする役割を果たします。
パラメータ: 構成ファイル my.cnf で設定できます。
- innodb_read_io_threads
- Innodb_write_io_threads
InnoDB ダーティ ページ リフレッシュ スレッド
MySQL 5.6 より前では、ダーティ ページのクリーニングはマスター スレッドによって処理されていました。5.6 以降、ページ クリーナー スレッドは、バッファ プール内のダーティ ページをフラッシュする作業を実装します。
パラメータ:
- innodb_page_cleaners : ダーティ ページ フラッシュ スレッドの数を設定します。(複数ページ クリーナー スレッドはバージョン 5.7.4 以降に導入されました)
- Innodb_buffer_pool_wait_free : ダーティ ページがシステムのパフォーマンスのボトルネックになっているかどうかをマークします。innodb_buffer_pool_size が十分に大きい場合は、Innodb_buffer_pool_wait_free の値を小さくすることも、0 にすることもできます。
InnoDB パージ スレッド
パージ スレッドは、使用され割り当てられた (元のデータの記録) アンドゥ ページを再利用する責任があります。
例外:
- 挿入操作はこのトランザクションのみに表示され、トランザクションがコミットされた直後に削除されるため、挿入取り消しログはパージする必要がありません。
- 更新取り消しログは更新削除操作によって生成され、後で MVCC によって使用される可能性があるため、送信時に削除することはできません。これはアンドゥ ログのリンク リストに追加され、最終的に削除されるパージを待ちます。
データ行を削除および更新する場合、データ ページで削除されるデータ行を「削除済み」としてマークすると、トランザクションの送信速度が速くなります。バックグラウンド スレッドのパージ スレッドが、データ内の「削除済み」ラベルが付いたデータ行を実際に削除します。ページ。
パラメータ:
- innodb_purge_threads : 同時パージ スレッドの数を調整できます。