page页
页是InnoDB存储小单位,默认是16K。用户数据和索引都是存放在数据页上面的。
BufferPool
bufferPool也就是缓存池,是一块内存空间。在bufferPool中,是以数据页为单位存放数据的。
redo日志
- redo log叫做重做日志,是用来实现事务的持久性,当事务提交之后会把所有修改信息都会存到redo日志中,是InnoDB独有的。redo重做是为了恢复。
- mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Buffer Pool里面,然后使用后台线程去做Buffer Pool和磁盘之间的同步。如果还没来的及同步就发生宕机,就可以读取redo日志来恢复最新数据
undo日志
- undo log 叫做回滚日志,用于记录数据被修改前的信息。
- undo log主要记录的是数据的逻辑变化,,每次写入数据或者修改数据之前都会把修改前的信息记录到 undo log,然后在发生错误时才可以回滚。
- 由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态
update语句的流程:update account set name=’Lilei666’ where id=1
- 先把要id=1的记录所在的数据页加载到Buffer Pool
- 把旧的值(LiLei)写入到undo日志,以便回滚
- 把新的值(LiLei666)更新到Buffer Pool
- 把更新记录写入redo日志
- 准备提交事务,redo日志写入磁盘
- 准备提交事务,binlog日志写入磁盘
- 写入commit标志到redo日志文件里,提交事务完成,该标志为了保证事务提交后redo与binlog数据一致
- 后台IO线程把Buffer Pool同步到磁盘。

为什么Mysql不能直接更新磁盘上的数据而且设置这么一套复杂的机制来执行SQL了?
- 因为磁盘随机读写的性能是非常差的,所以直接更新磁盘文件是不能让数据库抗住很高并发的。
- 这套机制可以保证每个更新请求都是更新内存BufferPool,然后顺序写日志文件,同时还能保证各种异常情况下的数据一致性,顺序io的效率要高于随机io。
- 更新内存的性能是极高的,然后顺序写磁盘上的日志文件的性能也是非常高的,要远高于随机读写磁盘文件
