InnoDB存储引擎以 页 为单位管理存储空间,增删改查的本质就是访问页面。为提高查询效率,DBMS会占用内存作为缓冲池,在执行SQL之前,会将磁盘上的页 缓存到内存中的 缓冲池(Buffer Pool)后执行相关SQL语句。
1、缓冲池(Buffer Pool)
- 在InnoDB存储引擎中有部分数据会放到内存中,缓冲池占该内存的大部分空间,用来存储各种数据的缓存,如下所示:

缓冲池的重要性:消除CPU和磁盘之间的鸿沟,InnoDB存储引擎中会将完整页的数据全部加载到内存中将其缓存起来,省去磁盘IO
缓冲原则:“位置 * 频次”原则,提高I/O访问效率进行优化,会优先对使用频次高的热数据进行加载
预读特性:在读取数据的时候存在一个“局部性原理” 即 使用一些数据,大概率会使用它周围的数据,则会采用预读的机制提前加载,有效减少未来可能的磁盘I/O操作
2、查询缓存
- 是指提前将 查询结果缓存 起来,后续不需要执行就能获取到结果。
- 在MySQL的查询缓存并非缓存查询计划,而是查询对应的结果,只要数据表发生变化,查询缓存都会失效。
- 与 缓冲池 的共同特点都是
通过缓存的机制提高效率
3、缓冲池读取数据
- 缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行读操作的时候,首先会判断该页面是否在缓存池中,如果存在直接读取,如果不存在就会通过内存或磁盘将页面放到缓冲池中再进行读取。
- 缓存在数据库中的结构和作用如下所示:

- 当对数据库中的记录进行修改时,首先会修改缓冲池中页里面的记录信息,然后数据库会
以一定频率刷新到磁盘上。缓冲池会采用一种叫 checkpoint 的机制 将数据写入磁盘
4、查看和设置缓冲池的大小
- MyISAM存储引擎,只缓存索引,不缓存数据,对应的键缓存参数为:
key_buffer_size
- InnoDB存储引擎,通过查看
innodb_buffer_pool_size变量来查看缓冲池的大小,命令如下:
mysql> show variables like '%innodb_buffer_pool_size';
+-------------------------+--