在mysql中,当内存数据页和磁盘数据页上的内容不一致时,则称这个内存页为脏页。刷脏页的场景:1、当redo log写满,mysql就会暂停所有更新操作,将同步这部分日志对应的脏页同步到磁盘;2、系统内存不足时,需要淘汰一部分数据页,如果淘汰的是脏页,就要先将脏页同步到磁盘;3、MySQL认为系统空闲的时候,有机会就同步内存数据到磁盘,这种没有性能问题。
本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。
平时很快的更新操作,都是在写内存和日志。
他并不会马上同步
到磁盘数据页,这时内存数据页跟磁盘数据页内容不一致,我们称之为脏页
。
这里面就涉及 mysql 的内存管理机制
缓冲区中包含这三大类列表。分别为:LRUList
、FreeList
、FlushList
。
在数据库刚启动时,LRUlist中没有数据页
。FreeList存放空闲页。
注意:这时这个页既在LRUlist中,又在FlushList中。
总结:LRUList(管理已经被读取的页)和FreeList(管理空闲的页)用来管理页的可用性;FlushList(管理脏页)用来管理脏页的刷新
在脏页数据同步到磁盘过程中,如果对该磁盘数据页执行 SQL 语句。执行速度就会变慢
如果数据修改和读取只依赖内存的缓冲区,那么一旦数据库宕机,内存中的数据都会丢失。所以MySQL使用之前讲过的redo log来实现异常重启的数据恢复。
简单来说,就是在更新缓冲区之前,先写入redo log,保证异常重启之后可以正常恢复缓冲区中的数据。
数据库宕机,内存数据丢失
。所以需要刷新到磁盘。所以自然而然,我们就一定需要把内存中的脏页按照某种规则刷新到磁盘中,有了刷新这个操作,缓冲区的大小问题和redo log的大小问题都可以解决。
当 redo log 写满
,mysql就会暂停所有更新
操作,将同步这部分日志对应的脏页同步到磁盘
。
系统内存不足
时,需要淘汰
一部分数据页,如果淘汰的是脏页
,就要先将脏页同步到磁盘
。
MySQL 认为系统空闲
的时候,有机会就同步
内存数据到磁盘,这种没有性能问题。
MySQL 正常关闭
,MySQL 会把内存的脏页都同步到磁盘
上,这样下次 MySQL 启动的时候,就可以直接从磁盘上读数据,启动速度会很快。这种没有性能问题。
如果是 redo log 写满了
要尽量避免redo log 写满
。否则整个系统的更新都会停止。此时写的性能变为 0
,必须等待该日志对应脏页同步完成
后才能更新,这时就会导致 sql 语句 执行的很慢。
【相关推荐:mysql视频教程】
以上是mysql脏页是什么的详细内容。更多信息请关注PHP中文网其他相关文章!