Help us understand the problem. What is going on with this article?

MySQL5.7に入門してみる~InnoDBと仲良くなりたい~

はじめに

前回MySQLのアーキテクチャについて調べていました。
その中でストレージエンジンがMySQLの理解を深めるのに重要そうだったので、ストレージエンジンともう少しお友達になりたいと思います。その中でも今回はInnoDBについてまとめます。

(前回のアーキテクチャに関する記事は こちら をご覧ください)

InnoDBの特徴

  • クラッシュリカバリ
  • トランザクション(ACID)
  • 外部キー
  • 主キーに基づいたクエリ最適化(データの整列)

割と当たり前だと思っていたトランザクション対応なんですけど、MySQLのストレージエンジンだと InnoDBだけなんですね。MySQLに詳しくないけど、トランザクションとか主キー、外部キーとかは知ってる方は多いのでは?と思います。

ただ、クラッシュリカバリ。。ね。。。。。。うん、わかるけど何してるんだ?って感じです。どんなことをやってるんですかね?

クラッシュリカバリ

MySQLが起動しているサーバに障害が発生し再起動が発生しても、自動的にリカバリしてくれる優れものです。リカバリのプロセスは下記のような流れです。

  • Redoログの適用(あれば)
  • 未完了トランザクションのロールバック
  • 挿入(変更)バッファのマージ
  • パージ

Redoログの適用

そもそもRedoログって話ですよね?Redoログとはクラッシュリカバリ中に、完全なトランザクションによる書き込まれるデータを訂正するためのデータです。
テーブルデータの変更の度にレコード単位でエンコードされ(このデータをまとめてRedoといいます)、ib_logfile0, ib_logfile1という名前が付けられ保存されます。まずはログバッファ(メモリ)に書き込まれ、その後ログファイルに書き込まれます。

シャットダウン前にこのデータファイル(テーブルデータ変更を記録しているデータファイル)の更新が終了されていない = リカバリ後に再度実行する必要があるって感じです。※似たようなログで binlog というのがあるのですが、用途やレイヤーが違うため今は言及しません

未完了トランザクションのロールバック

そのままなので特になし!

挿入(変更)バッファのマージ

これまた変更バッファとは?ってなります。変更バッファとは、読みだすデータ(ページ)がメモリ(バッファープール内)に無い場合に、セカンダリインデックスエントリへの変更をキャッシュしているデータです。
このデータはページがメモリにロードされたタイミングでマージされ、最終的にはディスクに書き出されます。呼び出されたタイミングでのマージだけではなく、サーバがほぼアイドル状態の時やクリーンシャットダウン(終了前にテーブルに全て適用させるシャットダウン)の際にもマージされます。

パージ

ガベージコレクションの一種です。スレッドが別途立ち上がり、定期的に下記を実行します。

  • 使われなくなったインデックスの削除
  • DELETEステートメントの物理的な削除

DELETEステートメントは即座にレコードの削除を行わず、「削除」とマークされるだけです(これ以降クエリから返されなくなります)。パージ処理によって「削除」とマークがついたレコードは削除されます。

まとめ

いかかでしたかね?InnoDBの特徴についてなんとなくでもご理解いただけたでしょうか?(ほとんどクラッシュリカバリの処理を追っているだけな気もしますが)

ただ調べて思ったのはわからない用語が多すぎますね、ほんとに。なので次はまた少し脱線して用語についても自分なりにまとめたいなと思いました。

ではみなさん、またの機会があれば。。。

参考

リファレンスマニュアル

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした