11 从数据的增删改开始讲起,回顾一下Buffer Pool在数据库里的地位
1、一切从数据的增删改开始讲起
讲解数据库应该从哪个环节开始入手呢?
当然是从数据库的增删改开始了,因为当你手头有了一个数据库之后,你必然就会去开发一个系统,系统就直接基于数据库做各种增删改查的操作,实现各种各样的业务逻辑。
我们专栏的讲解顺序,就按照你手头有了一个经过压测的、有完善监控的数据库之后,你开发的系统使用数据库的顺序来讲解,先讲解系统对数据库执行各种增删改操作时背后对应的内幕原理,以及事务的原理,包括锁的底层机制,然后讲解你有了数据之后,执行各种复杂的查询操作的时候,涉及到的索引底层原理,查询优化的底层原理。
然后讲解完这些之后,我们再来讲解平时我们在开发系统的时候,如何进行数据库的建模,在数据库建模的时候,应该如何注意字段类型、索引类型的一些问题,如何保证数据库避免死锁、高性能的运行。
2、回顾一下Buffer Pool是个什么东西?
现在我们先来回顾一下数据库中的Buffer Pool是个什么东西?其实他是一个非常关键的组件,因为我们通过之前的讲解都知道一点,那就是数据库中的数据实际上最终都是要存放在磁盘文件上的,如下图所示。

但是我们在对数据库执行增删改操作的时候,不可能直接更新磁盘上的数据的,因为如果你对磁盘进行随机读写操作,那速度是相当的慢,随便一个大磁盘文件的随机读写操作,可能都要几百毫秒。如果要是那么搞的话,可能你的数据库每秒也就只能处理几百个请求了!
之前我们也都讲解过了,你在对数据库执行增删改操作的时候,实际上主要都是针对内存里的Buffer Pool中的数据进行的,也就是你实际上主要是对数据库的内存里的数据结构进行了增删改,如下图所示。

当然,我们之前都说过,其实每个人都担心一个事,就是你在数据库的内存里执行了一堆增删改的操作,内存数据是更新了,但是这个时候如果数据库突然崩溃了,那么内存里更新好的数据不是都没了吗?
所以其实之前我们开头就用了很多篇幅讲这个问题,MySQL就怕这个问题,所以引入了一个redo log机制,你在对内存里的数据进行增删改的时候,他同时会把增删改对应的日志写入redo log中,如下图。

万一你的数据库突然崩溃了,没关系,只要从redo log日志文件里读取出来你之前做过哪些增删改操作,瞬间就可以重新把这些增删改操作在你的内存里执行一遍,这就可以恢复出来你之前做过哪些增删改操作了。
3、Buffer Pool的一句话总结
所以这里我们简单对Buffer Pool这个东西做一下总结,他其实是数据库中我们第一个必须要搞清楚的核心组件,因为增删改操作首先就是针对这个内存中的Buffer Pool里的数据执行的,同时配合了后续的redo log、刷磁盘等机制和操作。
所以Buffer Pool就是数据库的一个内存组件,里面缓存了磁盘上的真实数据,然后我们的Java系统对数据库执行的增删改操作,其实主要就是对这个内存数据结构中的缓存数据执行的。