InnoDBは、MySQLで最も広く使用されているストレージエンジンの1つです。このストレージエンジンは、高信頼性および高性能ストレージエンジンとして知られており、その主な利点には、行レベルのロック、外部キーのサポート、およびACIDモデルに従うことが含まれます。 InnoDBは、2010年にリリースされたMySQL 5.5以降、デフォルトのストレージエンジンとしてMyISAMに取って代わります。
このストレージエンジンは、適切に最適化されていれば、非常にパフォーマンスが高く、強力です。今日は、その能力を最大限に発揮させるためにできることを検討していますが、ダイビングする前にただし、InnoDBには、前述のACIDモデルが何であるかを理解する必要があります。
ACIDとは何ですか、なぜそれが重要なのですか?
ACIDは、データベーストランザクションのプロパティのセットです。頭字語は、Atomicity、Consistency、Isolation、Durabilityの4つの単語に変換されます。つまり、これらのプロパティにより、データベーストランザクションが確実に処理され、エラー、停電、またはそのような問題が発生した場合でもデータの有効性が保証されます。これらの原則に準拠したデータベース管理システムは、ACID準拠のDBMSであると言われています。 InnoDBですべてがどのように機能するかを次に示します。
- Atomicityは、トランザクション内のステートメントが分割できない単位として機能し、それらの効果が集合的に見られるか、まったく見られないことを保証します。
- 一貫性は、データベースへのすべての変更を記録するMySQLのロギングメカニズムによって処理されます。
- 分離とは、InnoDBの行レベルのロックを指します。
- InnoDBはシステムへのすべての変更を追跡するログファイルを維持するため、耐久性も維持されます。
ACIDについて説明したので、おそらくInnoDBが内部でどのように見えるかを確認する必要があります。 InnoDBの内部からの外観は次のとおりです(画像提供:Percona):
InnoDB Internals上の画像から、InnoDBにいくつかあることがはっきりとわかります。そのパフォーマンスに不可欠なパラメータとこれらは次のとおりです:
- innodb_data_file_pathパラメーターは、システムテーブルスペースを記述します(システムテーブルスペースは、InnoDBデータディクショナリ、二重書き込みおよび変更バッファー、および取り消しログのストレージ領域です)。このパラメーターは、InnoDBテーブルから派生したデータが保存されるファイルを示しています。
- innodb_buffer_pool_sizeパラメーターは、InnoDBがデータとそのテーブルのインデックスをキャッシュするために使用するメモリバッファーです。
- innodb_log_file_sizeパラメーターは、InnoDBログファイルのサイズを表します。
- innodb_log_buffer_sizeパラメーターは、ディスク上のログファイルへの書き込みに使用されます。
- innodb_flush_log_at_trx_commitパラメーターは、厳密なACIDコンプライアンスとより高いパフォーマンスの間のバランスを制御します。
- innodb_lock_wait_timeoutパラメーターは、InnoDBトランザクションが行ロックを待ってからあきらめるまでの時間の長さ(秒単位)です。
- innodb_flush_methodパラメーターは、I/Oスループットに影響を与える可能性のあるInnoDBデータファイルとログファイルにデータをフラッシュするために使用されるメソッドを定義します。
InnoDBは、テーブルのデータもibdata1というファイルに保存します。ただし、ログはib_logfile0とib_logfile1という名前の2つの別々のファイルに保存されます。これら3つのファイルはすべて/ var / lib/mysqlにあります。ディレクトリ。
InnoDBのパフォーマンスを可能な限り向上させるには、これらのパラメーターを微調整し、利用可能なハードウェアリソースを調べて、可能な限り最適化する必要があります。
ハードウェアでのInnoDBのパフォーマンスを調整するには、次の手順に従います。
-
innodb_data_file_pathを自動的に拡張するには、設定でautoextend属性を指定し、サーバーを再起動します。例:
innodb_data_file_path =ibdata1:10M:autoextend
autoextendパラメーターを使用すると、スペースが必要になるたびに、データファイルのサイズが8MBずつ自動的に増加します。新しい自動拡張データファイルも次のように指定できます(この場合、新しいデータファイルはibdata2と呼ばれます):
innodb_data_file_path =ibdata1:10M; ibdata2:10M:autoextend
-
InnoDBを使用する場合、使用される主なメカニズムはバッファープールです。 InnoDBはバッファープールに大きく依存しており、経験則として、innodb_buffer_pool_sizeパラメーターはサーバーで使用可能なRAMの合計の約60%から80%である必要があります。 OSで実行されているプロセス用にもRAMをいくらか残しておく必要があることに注意してください。
-
InnoDBのinnodb_log_file_sizeはできるだけ大きく設定する必要がありますが、必要以上に大きくしないでください。この場合、パフォーマンスにはログファイルのサイズが大きいほど良いことに注意してください。ただし、ログファイルのサイズが大きいほど、クラッシュ後の回復時間が長くなります。そのため、「1つのサイズですべてに対応」するソリューションはありませんが、ログファイルの合計サイズは十分に大きい必要があると言われています。これは、MySQLサーバーがチェックポイントとディスクフラッシュアクティビティで定期的に作業するのを助けます。これにより、CPUとディスクのIOが大幅に節約され、ピーク時や高いワークロードアクティビティ時にスムーズに実行できます。推奨されるアプローチは、自分でテストして実験し、自分で最適な値を見つけることです。
-
innodb_log_buffer_sizeの値は少なくとも16Mに設定する必要があります。大きなログバッファを使用すると、トランザクションがコミットしてディスクI / Oを節約する前に、ログをディスクに書き込むことなく、大きなトランザクションを実行できます。
-
innodb_flush_log_at_trx_commitを調整する場合、このパラメーターは0、1、2の3つの値を受け入れることに注意してください。値が1の場合、ACIDに準拠します。値が0または2の場合、パフォーマンスは向上しますが、信頼性は低下します。その場合、ログがまだディスクにフラッシュされていないトランザクションがクラッシュで失われる可能性があるためです。
-
innodb_lock_wait_timeoutを適切な値に設定するために、このパラメーターは前の時間を秒単位(デフォルト値は50)で定義することに注意してください。次のエラーを発行し、現在のステートメントをロールバックします:
エラー1205(HY000):ロック待機タイムアウトを超えました。トランザクションを再開してみてください
-
InnoDBでは、複数のフラッシュメソッドを使用できます。デフォルトでは、値がNULLに設定されている場合、この設定はWindowsマシンでは「async_unbuffered」に設定され、Linuxマシンでは「fsync」に設定されます。メソッドとその機能は次のとおりです。
InnoDBフラッシュメソッド | 目的 |
| InnoDBはシミュレートされた非同期I/OとバッファリングされたI/Oを使用します。 |
| InnoDBはシミュレートされた非同期I/OとバッファーなしI/Oを使用します。 |
async_unbuffered | InnoDBはWindows非同期I/Oと非バッファーI/Oを使用します。 Windowsマシンのデフォルト設定。 |
fsync | InnoDBはfsync()関数を使用してデータとログファイルをフラッシュします。 Linuxマシンのデフォルト設定。 |
O_DSYNC | InnoDBはO_SYNCを使用してログファイルを開いてフラッシュし、fsync()関数を使用してデータファイルをフラッシュします。 O_DSYNCはO_DIRECTよりも高速ですが、遅延や完全なクラッシュが原因で、データに一貫性がある場合とない場合があります。 |
nosync | |
littlesync | |
O_DIRECT | InnoDBはO_DIRECTを使用してデータファイルを開き、fsync()関数を使用してデータとログファイルの両方をフラッシュします。 O_DSYNCと比較すると、O_DIRECTはより安定しており、データの一貫性が高くなりますが、速度は遅くなります。この設定を使用すると、OSキャッシュが回避されます。この設定はLinuxマシンで推奨される設定です。 |
O_DIRECT_NO_FSYNC | InnoDBはI/Oのフラッシュ中にO_DIRECTを使用します-「NO_FSYNC」部分は、fsync()関数がスキップされることを定義します。 |
- innodb_file_per_table設定を有効にすることも検討する必要があります。このパラメータは、MySQL5.6以降ではデフォルトでオンになっています。このパラメーターは、InnoDBテーブルを個別のファイルに格納し、肥大化したメインディクショナリとシステムテーブルを回避することで、InnoDBテーブルに関連する管理上の問題を軽減します。この変数を有効にすると、特定のテーブルが破損したときにデータ回復の複雑さに直面することも回避できます
- 上記の手順に従ってこれらの設定を変更したので、準備はほぼ整っているはずです。ただし、実行に移す前に、InnoDBインフラストラクチャ全体で最もビジーなファイルであるibdata1に注意を払う必要があります。
ibdata1の処理
ibdata1に保存される情報にはいくつかのクラスがあります:
- InnoDBテーブルのデータ;
- InnoDBテーブルのインデックス;
- InnoDBテーブルのメタデータ;
- 多バージョン同時実行制御(MVCC)データ;
- 二重書き込みバッファー-このようなバッファーにより、InnoDBは半分書き込まれたページから回復できます。このようなバッファの目的は、データの破損を防ぐことです。
- 挿入バッファー-このようなバッファーは、InnoDBが同じページへの更新をバッファーするために使用するため、更新を次々に実行するのではなく、一度に実行できます。
ビッグデータセットを処理する場合、ibdata1ファイルは非常に大きくなる可能性があり、これは非常に苛立たしい問題の核となる可能性があります。ファイルは拡大することしかできず、デフォルトでは縮小することはできません。 MySQLをシャットダウンしてこのファイルを削除することはできますが、何をしているのかを理解していない限り、これはお勧めしません。削除すると、ディクショナリとシステムテーブルがなくなるため、MySQLは正しく機能しなくなり、メインシステムテーブルが破損します。
ibdata1を完全に縮小するには、次の手順に従います。
- InnoDBデータベースからすべてのデータをダンプします。このアクションには、mysqldumpまたはmysqlpumpを使用できます。
- mysql、performance_schema、information_schemaデータベースを除くすべてのデータベースを削除します。
- MySQLを停止します;
- my.cnfファイルに次を追加します。コード>
- ibdata1ファイルとib_logfile*ファイルを削除します(これらはMySQLの次回の再起動時に再作成されます)。
- MySQLを起動し、前に取得したダンプからデータを復元します。上記の手順を実行した後も、ibdata1ファイルは大きくなりますが、InnoDBテーブルのデータは含まれなくなります。ファイルにはメタデータのみが含まれ、各InnoDBテーブルはibdata1の外部に存在します。ここで、/ var / lib / mysqlディレクトリに移動すると、InnoDBエンジンで使用している各テーブルを表す2つのファイルが表示されます。ファイルは次のようになります。
- demotable.frm
- demotable.ibd
.frmファイルにはストレージエンジンヘッダーが含まれ、.ibdファイルにはテーブルデータとテーブルのインデックスが含まれます。
ただし、変更をロールアウトする前に、インフラストラクチャに応じてパラメータを微調整してください。これらのパラメーターは、InnoDBのパフォーマンスを左右する可能性があるため、常にそれらを監視するようにしてください。これで、準備が整いました!
要約すると、データの整合性と高いパフォーマンスを同時に必要とするアプリケーションを開発する場合、InnoDBのパフォーマンスを最適化することは大きなメリットになります-InnoDBを使用すると、エンジンに許可されるメモリの量を変更できます消費、ログファイルサイズの変更、エンジンが使用するフラッシュメソッドなど-これらの変更により、適切に調整されている場合、InnoDBのパフォーマンスが非常に向上する可能性があります。ただし、拡張を実行する前に、サーバーとMySQLの両方に対するアクションの結果に注意してください。
いつものように、パフォーマンスのために何かを最適化する前に、常にバックアップを取り(そしてテストしてください!)、必要に応じてデータを復元し、変更を本番環境にロールアウトする前に常にローカルサーバーで変更をテストできます。