4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【MySQL】基礎。InnoDBのbuffer poolはページ単位(列ではなく)でキャッシュする

Posted at

更新が多いテーブルはなるべくカラムを絞って InnoDB の buffer pool に乗るようにする

ゲームエンジニアのためのデータベース設計 - SlideShare

この論理の裏付けがイマイチわからなかったので調べた。
つまり、この言葉の裏には「buffer poolは行単位でキャッシュ管理している」という前提が存在するはず。

バッファープール

結論から言うとバッファープールは「複数行を保持できるページに分割」され、「ページのリンクリストとして実装」される。

テーブルとインデックスの両方のキャッシュされた InnoDB データを保持するメモリー領域。大容量読み取り操作の効率を高めるため、バッファープールは複数行を保持できるページに分割されます。キャッシュ管理の効率のために、バッファープールはページのリンクリストとして実装されます。まれにしか使用されないデータは、LRU アルゴリズムのバリエーションを使用してキャッシュからエージアウトされます。大容量メモリーを備えたシステムでは、バッファープールを複数のバッファープールインスタンスに分割することにより、並列性を改善できます。

MySQL :: MySQL 5.6 リファレンスマニュアル :: MySQL 用語集

内部の詳細

実装はもう少し複雑で、buffer poolは内部でさらに2つに分けられている。
ざっくり書くと、「新しめの領域」「古めの領域(全体の3/8のメモリ量が割り当てられる)」がそれで、LRU戦略によって削除されるデータは後者から選ぶ。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.9.1 InnoDB バッファープール

ということは…

employee table image

SELECT Name,Dept FROM Employees WHERE Id = 3;

上記のようなクエリを投げた際でもName = "Todd",Dept = "IT"だけキャッシュされるのではなく、1行分まるまる(ページの一部として)キャッシュにのる。というイメージだろう
(間違っていたらツッコミ欲しい)

(そもそもPRIMARY条件なので実際にはINDEX参照だけで足りそうだが今回は無視)

その他参考

SELECT のとき
バッファプール見る。あればそれを使う なければテーブルスペースファイルを読んで バッファプールに載せる
INSERT, UPDATE, DELETE のとき
バッファプールに書く。バッファプールに空きがなければ、古いページを押し出してから書く DELETE でさえも書く。 その後、ログファイルに書く

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?