はじめに
前回MySQLのアーキテクチャについて調べていました。
その中でストレージエンジンがMySQLの理解を深めるのに重要そうだったので、ストレージエンジンともう少しお友達になりたいと思います。その中でも今回はInnoDBについてまとめます。
(前回のアーキテクチャに関する記事は こちら をご覧ください)
InnoDBの特徴
- クラッシュリカバリ
- トランザクション(ACID)
- 外部キー
- 主キーに基づいたクエリ最適化(データの整列)
割と当たり前だと思っていたトランザクション対応なんですけど、MySQLのストレージエンジンだと InnoDBだけなんですね。MySQLに詳しくないけど、トランザクションとか主キー、外部キーとかは知ってる方は多いのでは?と思います。
ただ、クラッシュリカバリ。。ね。。。。。。うん、わかるけど何してるんだ?って感じです。どんなことをやってるんですかね?
クラッシュリカバリ
MySQLが起動しているサーバに障害が発生し再起動が発生しても、自動的にリカバリしてくれる優れものです。リカバリのプロセスは下記のような流れです。
- Redoログの適用(あれば)
- 未完了トランザクションのロールバック
- 挿入(変更)バッファのマージ
- パージ
Redoログの適用
そもそもRedoログって話ですよね?Redoログとはクラッシュリカバリ中に、完全なトランザクションによる書き込まれるデータを訂正するためのデータです。
テーブルデータの変更の度にレコード単位でエンコードされ(このデータをまとめてRedoといいます)、ib_logfile0, ib_logfile1
という名前が付けられ保存されます。まずはログバッファ(メモリ)に書き込まれ、その後ログファイルに書き込まれます。
シャットダウン前にこのデータファイル(テーブルデータ変更を記録しているデータファイル)の更新が終了されていない = リカバリ後に再度実行する必要
があるって感じです。※似たようなログで binlog というのがあるのですが、用途やレイヤーが違うため今は言及しません
未完了トランザクションのロールバック
そのままなので特になし!
挿入(変更)バッファのマージ
これまた変更バッファとは?ってなります。変更バッファとは、読みだすデータ(ページ)がメモリ(バッファープール内)に無い場合に、セカンダリインデックスエントリへの変更をキャッシュしているデータです。
このデータはページがメモリにロードされたタイミングでマージされ、最終的にはディスクに書き出されます。
呼び出されたタイミングでのマージだけではなく、サーバがほぼアイドル状態の時やクリーンシャットダウン(終了前にテーブルに全て適用させるシャットダウン)の際にもマージされます。
パージ
ガベージコレクションの一種です。スレッドが別途立ち上がり、定期的に下記を実行します。
- 使われなくなったインデックスの削除
- DELETEステートメントの物理的な削除
DELETEステートメントは即座にレコードの削除を行わず、「削除」とマークされるだけです(これ以降クエリから返されなくなります)。パージ処理によって「削除」とマークがついたレコードは削除されます。
まとめ
いかかでしたかね?InnoDBの特徴についてなんとなくでもご理解いただけたでしょうか?(ほとんどクラッシュリカバリの処理を追っているだけな気もしますが)
ただ調べて思ったのはわからない用語が多すぎますね、ほんとに。なので次はまた少し脱線して用語についても自分なりにまとめたいなと思いました。
ではみなさん、またの機会があれば。。。