mysql脏页是什么


Posted in MySQL onJuly 26, 2021

脏页(内存页)

干净页:内存和磁盘中的数据一致
脏页:内存和磁盘中的数据不一致

为什么会出现 脏页

平时很快的更新操作,都是在写内存和日志。
他并不会马上同步到磁盘数据页,这时内存数据页跟磁盘数据页内容不一致,我们称之为脏页。
这里面就涉及 mysql 的内存管理机制

内存管理机制简述

缓冲区中包含这三大类列表。分别为:LRUList、FreeList、FlushList。
在数据库刚启动时,LRUlist中没有数据页。FreeList存放空闲页。

  • 当需要读取某个页时,会从FreeList中获取一个空闲页,读入数据后,放入LRUlist中
  • 如果FreeList中没有空闲页了,那么根据LRU算法淘汰Lru列表中末位的页
  • 当LRUlist中的页被修改后,页就变成了脏页,这个页也会被加入FlushList中

注意:这时这个页既在LRUlist中,又在FlushList中。

总结:LRUList(管理已经被读取的页)和FreeList(管理空闲的页)用来管理页的可用性;FlushList(管理脏页)用来管理脏页的刷新

在脏页数据同步到磁盘过程中,如果对该磁盘数据页执行 SQL 语句。执行速度就会变慢

数据修改和读取只依赖缓冲区行不行

如果数据修改和读取只依赖内存的缓冲区,那么一旦数据库宕机,内存中的数据都会丢失。所以MySQL使用之前讲过的redo log来实现异常重启的数据恢复.

简单来说,就是在更新缓冲区之前,先写入redo log,保证异常重启之后可以正常恢复缓冲区中的数据。

为什么脏页一定要刷新

  • 上面说了 数据只放在缓冲区,会出现数据库宕机,内存数据丢失。所以需要刷新到磁盘。
  • redo log如果无限大或者有许多个文件的话,系统中有大量的修改操作,一旦宕机,恢复的时间也会非常长。

所以自然而然,我们就一定需要把内存中的脏页按照某种规则刷新到磁盘中,有了刷新这个操作,缓冲区的大小问题和redo log的大小问题都可以解决。

  • 缓冲区不需要无限大了,因为可以持久化到磁盘
  • redo log也不需要无限大了,因为一旦持久化到磁盘,redo log中对应的那部分数据就可以释放。

刷脏页有下面4种场景

  • 当 redo log 写满,mysql就会暂停所有更新操作,将同步这部分日志对应的脏页同步到磁盘。
  • 系统内存不足时,需要淘汰一部分数据页,如果淘汰的是脏页,就要先将脏页同步到磁盘。
  • MySQL 认为系统空闲的时候,有机会就同步内存数据到磁盘,这种没有性能问题。
  • MySQL 正常关闭,MySQL 会把内存的脏页都同步到磁盘上,这样下次 MySQL 启动的时候,就可以直接从磁盘上读数据,启动速度会很快。这种没有性能问题。

会造成的影响

1 如果是 redo log 写满了
要尽量避免redo log 写满。否则整个系统的更新都会停止。此时写的性能变为 0,必须等待该日志对应脏页同步完成后才能更新,这时就会导致 sql 语句 执行的很慢。

 到此这篇关于mysql脏页是什么的文章就介绍到这了,更多相关mysql脏页内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
Mysql - 常用函数 每天积极向上
Apr 05 MySQL
解决Navicat for Mysql连接报错1251的问题(连接失败)
May 27 MySQL
MySQL 全文检索的使用示例
Jun 07 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
解决Mysql多行子查询的使用及空值问题
Jan 22 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
MYSQL常用函数介绍
May 05 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 MySQL
MySQL新手入门进阶语句汇总
Sep 23 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 #MySQL
MySQL深度分页(千万级数据量如何快速分页)
ORM模型框架操作mysql数据库的方法
mysql 直接拷贝data 目录下文件还原数据的实现
MySQL索引是啥?不懂就问
MySQL 四种连接和多表查询详解
MySQL 聚合函数排序
You might like
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
PHP 第三节 变量介绍
2012/04/28 PHP
php类中private属性继承问题分析
2012/11/01 PHP
如何让CI框架支持service层
2014/10/29 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
Python 第一步 hello world
2009/09/25 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
Python 中如何写注释
2020/08/28 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
北京故宫的导游词
2015/01/31 职场文书