上篇文章说了,刷新数据是通过页为单位,不可能每次查询都从磁盘查询,于是有了buffer pool,通过free,flush来刷新到磁盘,系统正常关闭,系统空闲,内存不足时候刷新。lru链表为了提高缓存命中率来刷新页到磁盘。后面介绍了acid,原子性代表在一个事务里要么全部成功要么全部失败,一致性官方文档解释是除了数据库的主键建等约束外,还有业务的约束保证一直性,新增和扣减必须一致。
Redo日志
我们为了保证持久化,每次都需要把数据刷新到磁盘上,但我们是根据页来刷新的,并且修改一条sql语句可能包含很多页,但每个页值修改一个字节,很少的数据,这时候总不能直接持久化,但如果系统宕机了,数据没有持久化就会丢失,于是,redo日志就出现了(重做日志)。
Redo日志有两个特点,占用非常小,并且顺序写入磁盘(页的存放是随机I/O)。
所以redo日志大致就是type,space id表空间id,page numer页号,data 日志具体内容。
前面说过当表没有主键或者建,这时候会给一个隐藏的row_id,有个max_row_id是一个全局变量,每次插入会自增1。
我们在执行一条修改语句会修改很多数据,比如索引的几棵b+树,树上的内节点和叶子节点等,也可能创建新页面。
Redo日志有日志缓冲区,类似于buffer pool,会申请redo log buffer连续内存,默认16mb。
这个缓冲区是干嘛的呢,前面我们说了真实刷新数据是在buffer pool里面,但是在存储之前会记录数据到redo log日志上,redo log有点就是占用小,并且顺序I/O,变相来说,redo log实现了从随机I/O变成了顺序I/O,当然buffer pool本身是刷数据还是随机I/O。
Log sequence number:系统运行会不断修改页面生成redo日志,当前默认值是8704,随着redo日志越来越多而升高。Redo日志每条数据都有lsn值,lsn值越小,则代表越早生成。
如何查看系统中的各种lsn值呢,通过show engine innodb。