innodbのbuffer pool

2515 ワード

innodbはbuffer poolの仕組みがありますので、参考にしてください。
http://dev.mysql.com/doc/refman/5.1/en/innodb-buffer-pool.html
buffer poolはpage単位で記録をキャッシュすることができます。

CREATE TABLE `20130122handler` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL,
  `content` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `20130122handler_idx_uid` (`uid`)
) ENGINE=InnoDB
この表には60 wのランダムデータがあります。
先に実行してください

show status like 'Innodb_buffer_pool_read%';
結果は
Innodb_ブザーpool_read_.requests 1204
Innodb_ブザーpool_reads         97
そして実行します

select * from 20130122handler where uid=4349023;
使用時は0.016 sです

show status like 'Innodb_buffer_pool_read%';
結果は
Innodb_ブザーpool_read_.requests 1221
Innodb_ブザーpool_reads 98
データを見て、Innodb_が見つかりました。ブザーpool_readsが増えました
このデータはオフラインではなくハードディスクから読み込む必要があると説明します。
もう一度実行します

select * from 20130122handler where uid=4349023;
使用時間は0 sです
使用状況を観察する
Innodb_ブザーpool_read_.requests 1237
Innodb_ブザーpool_reads 98
明らかに今回はbuffer poolのデータだけを読み込めばいいです。ディスクIOを一度省きました。
pageでキャッシュすると、同じpageに連続して読み込むのが良いです。ディスクIOが最初にあります。
rowでキャッシュするという提案もあります。
http://rdc.taobao.com/team/jm/archives/1107
buffer poolは汚染された状況があります。即ち、ホットスポットではないデータがホットスポットのデータをbuffer poolから押し出しました。
http://www.orczhou.com/index.php/2010/05/innodb-plugin-make-buffer-cache-scan-resistant/
buffer poolは起動時は空いていますので、予めwarm upしておいたほうがいいです。
http://www.mysqlperformanceblog.com/2008/05/01/quickly-preloading-innodb-tables-in-the-buffer-pool/
しかし、mysql 5.6は新しい機能を持っています。閉じられる時にdumpがbuffer poolのイメージを出して、起動する時にreloadします。
http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_warm_upする。