MySQL 5.5以降でのデフォルトのストレージエンジン
以前はトランザクションをサポートしないMyISAMがデフォルトのストレージエンジンでしたが、2010年12月にリリースされたMySQL 5.5以降はInnoDBがデフォルトとなりました。InnoDBのデータサイズの上限は64TBです。InnoDBの主な機能は以下の通りです。
- トランザクション対応
- クラッシュリカバリ
- データとインデックスを表領域に格納
- 外部キーのサポート
InnoDBのトランザクション管理
InnoDBはACID準拠のトランザクションに対応したストレージエンジンです。トランザクションの独立性に関する分離レベルは、4種類全て実装しています。
A | Atomicity | 原始性 | 処理が全て成功するか全て失敗するかのどちらか |
C | Consistency | 一貫性 | あらかじめ設定された整合性を保つ |
I | Isolation | 独立性 | 他の処理に影響を与えない |
D | Durability | 耐久性 | 完了した処理は永続的に保持される |
InnoDBはMVCC (Multi Version Concurrency Control)でトランザクションを実装しています。トランザクション開始時にディスク上のデータをメモリ上の「バッファプール」にコピーし、以降の操作をメモリ上で行います。別のトランザクションは別のバージョンのコピーを作るためMVCCと呼ばれます。
InnoDBのログ
InnoDBはトランザクションをログに記録します。コミットされるまでの実行中のトランザクションはメモリ上にキャッシュされます。コミットが実行されるとディスク上のログファイルに書き出されます。コミット時に発生するディスクへの書き込みはログのみで、データそのものはチェックポイントと呼ばれるタイミングで別途書き出されます。
クラッシュリカバリ
サーバが障害などで停止してしまった場合、データファイルとログファイルが正常な場合には、MySQLサーバの再起動時にクラッシュリカバリの処理が実行されます。このクラッシュリカバリではログファイルとデータファイルの比較を行い、コミットが完了しているのにデータに反映されていないトランザクションが存在する場合には、自動的にトランザクション内容をデータに反映していきます。
InnoDBの表領域
InnoDBはデータを表領域に格納します。表領域は論理的な領域で、実際のデータは表領域ファイルなどに格納されます。デフォルトの設定では、複数のテーブルのデータとインデックスを1つのファイルに格納します。このファイルは、あらかじめ容量を設定しておくことや、容量を自動拡張するautoextendオプションを設定することができます。また複数ファイルにすることもできますが、autoextendオプションが使えるのはリストの最後に書かれたファイルのみです。
例:1GBのibdata1とibdata2を表領域ファイルとし、容量の自動拡張を有効にした設定
innodb-data-file-path= ibdata1:1G;ibdata2:1G:autoextend
innodb-file-per-tableオプションを使うと、テーブルごとにデータとインデックスを格納する表領域ファイルを作成します。また他のRDBMSと同様に、ファイルシステムを使わないrawデバイスを表領域に設定することも可能です。但しrawデバイスの利用はMySQLの運用ではあまり一般的ではありません。