mysql内存模型
BufferPool模型
bufferpool里面有三个链表:
free链表:其作用是管理空闲页,实际上存储的是一个个小控制块,控制块中存放的是对应结点的地址指针
flush链表:其作用是管理脏页,结构和free链表相同,但表达意义不同
lru链表:其作用是进行淘汰页、将最近最久未使用的页替换出来。通常将lru链表分成热数据部分和冷数据部分,比例默认为5:3。
设置为2部分的原因为:若未设置冷热区分,依次全表扫描就会将原理的大多数热点页全部替换掉,但后续替换进去的页实际访问量很少,得不偿失。
冷数据区域数据进入热数据区域的时机:访问同一页的时间间隔1s。为何间隔时间大于而非小于1秒,是因为如果全表扫描的话,数据是一行一行的遍历,相同的一页会很快的被访问,时间间隔远远小于一秒。
日志日志分布图
redolog(物理日志)若脏页没有来得及刷新到磁盘中,mysql挂掉了。可使用redolog进行恢复-------读取磁盘中原来的数据+redolog中的操作==在原数据上将以前的操作再做一遍,以达到恢复的效果。
重做时,只需要顺序的读取redolog,是顺序io,速度快。
redolog更新磁盘中的redologfile默认是2个,当两个都写满了的时候,会触发检查点,将其中某个logfile文件中的操作结合bufferpool中的脏页刷新到磁盘中。例如:0号文件满了,将继续写入当1号文件。若1号文件也满了,后续动作是触发checkpoint,将0号文件中的对应的脏页刷新到磁盘中,后将redolog记录覆盖到0号文件中。
redolog持久化即:将logBuffer中的缓存写入到磁盘中(redolog)。
更新时机(innoDB_flush_log_at_trx_