0%

MySQL清空Innodb Buffer Pool缓冲池的方法

Innodb存储引擎的缓冲池Buffer Pool会保存经常访问的数据到内存中,对MySQL的性能有很大的提升。在做性能测试的时候,由于缓冲池的存在,同一个SQL多次执行的运行时间可能不一样。测试SQL的时候可能需要Innodb Buffer Pool清空,以消除缓冲池对性能的影响。

方法很简单:重启MySQL

下面是验证过程,可以不用再往下看。

重启之前查看buffer pool中的页数:

1
show engine innodb status;

主要输出如下:

1
2
3
4
5
6
7
8
9
......
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 136970240
Dictionary memory allocated 434669
Buffer pool size 8192
Free buffers 0

......

从输出可以看到,Buffer Pool Size显示一共有8192个页,Free buffers是0,说明已经没有空闲的页了。

Innodb Buffer Pool默认大小是128MB,每个页16KB,所以一共8192个页。

重启数据库后再查看:

1
2
3
4
5
6
7
8
9
......
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 136970240
Dictionary memory allocated 379717
Buffer pool size 8192
Free buffers 5910
Database pages 2278
......

从输出可以看到,空闲页Free buffers有5000多个,说明已经使用了大约3000个页。并没有完全清空。

这是因为Innodb Buffer Pool中不止是数据页和索引页,还包括系统页、事务数据页、Insert Buffer、Insert Buffer位图、Undo Log页等等。
这些数据页在MySQL启动的时候就会用到/分配。