参考資料にした資料
InnoDB とは
- MySQL 5.5 からのデフォルトストレージエンジン
- 信頼性・パフォーマンスのバランスが良い汎用ストレージエンジン
- DML 操作は、コミット・ロールバック・クラッシュリカバリなどの ACID モデルに従ったトランザクション処理
- 主キーに基づきクエリが最適化されるようにディスク上でデータが整列される
- 別のストレージエンジンのテーブルを呼び出す操作を1つのクエリ内に混在させられる
- 外部キー制約もサポートされている
- MyISAM が常にファイルにデータを格納するのに対して、InnoDB はテーブルスペースに格納する
- MyISAM の良いところはテーブル単位でのバックアップやコピーが容易に行える点だが、InnoDB この点において現状まだ取り回しが悪い
- テーブルスペースはファイルに格納することもできるが、パーティションに直接書き込むこともできる
- データとインデックスをメインメモリーにキャッシュするための独自のバッファープールが存在し、高速なデータアクセスを助ける
InnoDB の特徴
ACID モデル
- ミッションクリティカルなアプリケーションで重要となるデータベースの設計原則セット
- A: 原子性 – トランザクション関係
- C: 一貫性 – クラッシュからデータを保護するための内部的な InnoDB 処理
- I: 分離性 – トランザクション関係
- D: 持続性
- InnoDB はソフトウェアクラッシュやハードウェア障害のような状況でもデータが破損せず、結果が歪曲されないために ACID モデルに厳密に準拠したコンポーネントが含まれている
InnoDB の構成
- InnoDB ストレージエンジンでは主に次の2つのリソースを管理している
- テーブルスペースデータファイル
- ログファイル
- デフォルトでは次のようなファイルが MySQL データディレクトリに作成される
- 自動拡張データファイル:
ibdata1
- ログファイル:
ib_logfile0-1
- 自動拡張データファイル:
- 大まかな構造
- オンメモリ: ログバッファ/バッファプール(インデックスページ/データページ/ハッシュインデックス/Undoログ/ロック情報/その他メタデータ)
- ディスク: ログファイル/テーブルスペース(データ/ロールバックセグメント/インサートバッファ/ダブルライトバッファ)
InnoDB への更新
- InnoDB テーブルの更新は以下のような手順で行われる(WAL: Write Ahead Log)
- 更新する対象のページがバッファ内に存在していれば、オンメモリのバッファプールの更新
- 存在していなかった場合、ディスク上のテーブルスペースからバッファプールに読み出されて更新される
- トランザクションをコミットすると、更新内容がログファイルに書き込まれる
- その後、テーブルスペースに更新が反映される(チェックポイント処理)
- テーブルスペースへの書き込み時にダブルライトバッファ、テーブルスペースと2回書き込みを行う
- Insert 時にセカンダリインデックスの該当ページがオンメモリ出ない場合、インデックスの内容は挿入バッファに書き込まれる
- ログファイルに書き込まれているが、テーブルスペースに書き込まれていないものをダーティーページとよぶ
- InnoDB のログファイルはサイズと個数が固定、ログファイルを頭から尻まで使い切ると次のログファイルを頭から利用し始める動き
innodb_max_dirty_pages_pct
でバッファプールに対するダーティーページの比率の上限を設定でき、これを超えるとチェックポイント処理が走る- ログファイルが作成されたから何バイト分記録したかという情報(LSE)は
SHOW ENGINE INNODB STATUS
コマンドで確認できる