面试官:什么是 BufferPool ?

719 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 9 天,点击查看活动详情

哈喽,大家好,我是二毛。

之前看到网上好多资料都是写着 Mysql 都是基于磁盘读写的,所以性能很差,因此会引人 Redis 来作为缓存,提升接口访问速度......啊巴啊巴

但是 Mysql 真的是全部都基于磁盘读写的吗?其实不然,Mysql 内部有个 BufferPool,也就是其内部的缓存,当请求命中 BufferPool 时,就能避免请求不去磁盘读写,一定程度上提升接口性能。

所以 “Mysql 都是基于磁盘读写的” 这句话其实一定程度上是错误的。

那么什么是 BufferPool 呢?

什么是 BufferPool

它其实也就是缓存池的意思,是 Mysql 当中至关重要的一个组件,可以这么说,MySQL的所有的增删改的操作都是在 Buffer Pool 中执行的。

它在 SQL 整个执行流程所处的位置如图所示:

为什么会出现 BufferPool

因为 数据库 要从磁盘中拿数据啊,那肯定就需要IO啊,并且数据库并不知道它将要查找的数据是磁盘的哪个位置,所以这就需要进行随机IO,那这个性能简直就别玩了。所以 MySQL对数据的操作都是在内存中进行的,也就是在 Buffer Pool 这个内存组件中,然后通过一定的策略将其持久化到磁盘中。

BufferPool 的大小

Buffer Pool 是 InnoDB 中的一块内存区域,它一定是有自己的大小的,且大小默认是 128M,不过这个容量可能有点小了,自己的生产环境可以根据实际的内存大小进行调整,参数为:innodb_buffer_pool_size=2147483648 单位是字节。

最后

BufferPool 其实是一个非常复杂的组件,里面还有很多东西这里还没涉及到,如:数据页、缓存页、lru链表、free链表、flush链表等,由于时间篇幅问题,后续再进行介绍。

我是二毛,我们下期再见~