InnoDB の概要
InnoDB は基本的なトランザクション対応のデータストアとなる。コンポーネントを以下の図に示す。
トランザクションではそれぞれステーブルデータベース、データベースキャッシュ、ステーブルログ、ログバッファという用語が登場するが、InnoDB ではテーブルスペース、バッファプール、ログ、ログバッファがそれぞれ対応する。
データへのアクセスはクライアントからのリクエストによりトランザクションが開始されるところから始まる。クライアントからのデータの読み書きへの応答は、全てデータベースキャッシュを介して行われ、参照あるいは更新するデータがキャッシュになければステーブルデータベースから該当のデータがフェッチされることになる。もしリクエストが更新であった場合、データの変更は全てデータベースキャッシュ上で行われ、即座にはステーブルデータベースには書き込まれない。整合性を担保するために、ステーブルデータベースよりも先にステーブルログを更新しなければならないという制約がある。
あるクライアントからのトランザクションが開始してから、排他処理等により実行が妨げられず、必要な更新が全て完了すると、データを永続化する処理を行う (COMMIT)。一旦 COMMIT したデータは消失してはいけないため、COMMIT が完了するまでにログバッファを通じてステーブルログにも書き込まれる。データベースキャッシュ上には存在するが、ステーブルデータベースにはまだ書き込まれていないダーティなデータは、バックグラウンドで順次ステーブルデータベースに書き込まれる。ダーティデータが残っている状態でサーバがクラッシュすると、再起動後にリカバリしなければいけない。ダーティデータはステーブルデータベースにはないが、ステーブルログには存在するので、ステーブルログの内容を再生することで COMMIT 済みの変更はすべて復元されることになる。
InnoDB の機能的な特徴
InnoDB が持つ機能的な特徴は以下となる。
- ACID 準拠のトランザクション
- 行レベルロック
- 4 つの分離レベルのサポート
- デッドロック検出
- セーブポイント
- B+ ツリーインデックス
- R ツリーインデックス
- フルテキストインデックス
- 外部キーのサポート
- データ圧縮
- memcached インターフェイス
InnoDB はトランザクションに対応しているため、ACID 特性を備えている。また、READ-UNCOMMITTED 、READ-COMMITTED 、REPEATABLE-READ 、SERIALIZABLE の分離レベルも利用できる。
InnoDB には豊富な機能があり、性能的にも十分であるため、オールマイティにさまざまな用途で利用できる。MySQL はテーブルごとにストレージエンジンを変更できるようになっているが、ほとんどのケースにおいて InnoDB 以外を選択する理由はなくなってきている。