Innodb_buffer_pool_size
《深入浅出MySQL》一文中这样描述Innodb_buffer_pool_size:
该参数定义了 InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小。和 MyISAM 存储引擎不同,MyISAM 的 key_buffer_size只缓存索引键, 而 innodb_buffer_pool_size 却是同时为数据块和索引块做缓存,这个特性和 Oracle 是一样的。这个值设得越高,访问 表中数据需要的磁盘 I/O 就越少。在一个专用的数据库服务器上,可以设置这个参数达机器 物理内存大小的 80%。尽管如此,还是建议用户不要把它设置得太大,因为对物理内存的竞 争可能在操作系统上导致内存调度。
将书的话解释过来就是该参数代表了用来缓存索引数据和表数据的内存大小,数据在内存中的读写速度是磁盘读写速度的很多倍,当数据满足条件后才将内存中的数据刷入磁盘中,innodb利用缓存池来帮助延迟写入,合并多个写入操作顺序写入磁盘。
先弄清以下几个点:
1.InnoDB缓存池存储什么
InnoDB缓存池缓存索引、行的数据、自适应哈希索引、插入缓存(Insert Buffer)、锁 还有其他的内部数据结构。(所以,如果数据库的数据量不大,并且没有快速增长,就不必为缓存池分配过多的内存,当为缓存池配置的内存比需要缓存的表和索引大很多也没什么必要,会造成资源浪费。)
2.缓存池过大也会带来一些困扰
a.很大的缓存池可能会有很多脏页,导致InnoDB在关闭的时候会消耗很长的时间,因为要把脏页写回到数据文件里