更新が多いテーブルはなるべくカラムを絞って 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 バッファープール
ということは…
SELECT Name,Dept FROM Employees WHERE Id = 3;
上記のようなクエリを投げた際でもName = "Todd",Dept = "IT"
だけキャッシュされるのではなく、1行分まるまる(ページの一部として)キャッシュにのる。というイメージだろう
(間違っていたらツッコミ欲しい)
(そもそもPRIMARY条件なので実際にはINDEX参照だけで足りそうだが今回は無視)
その他参考
SELECT のとき
バッファプール見る。あればそれを使う なければテーブルスペースファイルを読んで バッファプールに載せる
INSERT, UPDATE, DELETE のとき
バッファプールに書く。バッファプールに空きがなければ、古いページを押し出してから書く DELETE でさえも書く。 その後、ログファイルに書く