1. MySQL的日志

这篇文章主要以InnoDB引擎为例。
在MySQL的InnoDB当中,有两个重要日志模块,一个是redo log(重做日志) 一个是binlog(归档日志) 。
redo log的好处

1.当我们修改一条数据时,如果数据在内存中,我们是先会去改内存的,而不是先去改磁盘。假如数据都在内存中,这时候断电了怎么办,服务器宕机怎么办,这个时候就需要我们的redo log了。

2.redo只是记录了对数据的修改,数据会比一页数据小得多。大大减少了IO频率。并且想比于更新操作,更新过程是在磁盘上随机IO,费时。 而写redo log 是在磁盘上顺序IO。效率要高。

在每一条数据更新时,MySQL会先写redo log日志,在去写binlog 日志。在写这两个日志过程中会涉及到两阶段提交。他可以保证两个日志逻辑上的一致性。所以即使因为停电,宕机等原因,MySQL也可以通过redo log将数据进行恢复。

两者区别

redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=10 这一行的 c 字段加 10 ”。

redo log 是循环写的,空间固定会用完; binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

有了redlog,为什么还要有binglog
一个原因是,redolog只有InnoDB有,别的引擎没有。另一个原因是,redolog是循环写的,不持久保存,binlog的“归档”这个功能,redolog是不具备的。

redo log 是循环写的,固定空间用完会怎么办?这个也就是下面也会带着大家去了解的MySQL的刷脏页策略。

2.缓冲池(buffer pool)

buffer pool 是数据库的一个内存组件,里面缓存了磁盘上的真实数据,Java系统对数据库的增删改操作,主要是这个内存数据结构中的缓存数据执行的。

MySQL的InnoDB能使用内存会尽量的使用内存。这样是为了加速数据访问,把查询数据放在MySQL作为一个存储系统,使用缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO。

它的默认大小是128M。在实际的生产环境中可以通过参数innodb_buffer_pool_size对 buffer pool进行调整

关于缓冲池大家可以参考这篇文章去深入了解:缓冲池(buffer pool),这次彻底懂了!!!

3.什么时候会刷脏页

什么是脏页

当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。

什么是干净页

内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”

MySQL什么时候会刷脏页
(1)redo log满了
因为我们redo log日志是有固定空间的,如果它满了的话,就会进行刷脏页 (flush 脏页)。MySQL会先把内存数据更新到磁盘上,并把redo log进行清空。这种情况是 InnoDB所有更新会为0,因为出现这种情况的时候,整个系统就不能再接受更新了,所有的更新都必须堵住。
(2)内存满了
因为我们MySQL的缓冲池是有固定内存大小的,当我们缓冲池满了的时候,这时候也会进行刷脏页。而这时在内存中的数据会有三种类型数据页

第一种是,还没有使用的; 第二种是,使用了并且是干净页;第三种是,使用了并且是脏页。

而当要读入的数据页没有在内存的时候,就必须到缓冲池中申请一个数据页。这时候只能把最久不使用的数据页从内存中淘汰掉:如果要淘汰的是一个干净页,就直接释放出来复用;但如果是脏页呢,就必须将脏页先刷到磁盘,变成干净页后才能复用。

(3)mysql空闲的时候
这个时候就是我们MySQL比较空闲,没有请求的时候。这个时候redo log会flush 脏页,会把内存中的脏页更新到我们的磁盘里。
(4)mysql正常关闭的时候
因为我们MySQL正常关闭,肯定是要把内存脏页更新到磁盘中的。

会影响性能的刷脏页操作

1.比如我们一个查询要淘汰的脏页个数太多,如果MySQL刷脏页速度很慢,则会导致查询的响应时间明显变长;

2.redo log 写满了,导致这个系统更新为0;

4.刷脏页控制策略

1.设置系统刷脏页的速度和能力

show global variables like ‘innodb_io_capacity’; 查看当前系统刷脏页的能力

set global innodb_io_capacity=200; 进行设置刷脏页速度

2.设置脏页比例
如果我们系统一直全力去刷盘的话,那其他业务必定会受到影响。所以我们需求设置脏页比例,去执行刷盘。脏页比例默认75%,一定不要让其接近75%**
查看当前脏页比例

参数innodb_max_dirty_pages_pct是脏页比例上限,默认值是75%

select VARIABLE_VALUE into @a from performance_schema.global_status where VARIABLE_NAME = ‘Innodb_buffer_pool_pages_dirty’; select VARIABLE_VALUE into @b from performance_schema.global_status where VARIABLE_NAME = ‘Innodb_buffer_pool_pages_total’; select @a/@b;

3. 刷脏页速度 nnodb_io_capacity定义的能力乘以R%(redolog)来控制刷脏页的速度

InnoDB每次写入的日志都有一个序号,当前写入的序号跟checkpoint对应的序号之间的差值,InnoDB会将这两个值经过一定的计算得出一个数,这个结果数就是用来控制刷脏页的速度。

4. innodb_flush_neighbors=0(不开启脏页相邻淘汰) (对于机械硬盘顺序读写会有提升,ssd无提升。iops普通机械硬盘只有几百,ssd有上千,可以不开启)

在MySQL 8.0中,innodb_flush_neighbors参数的默认值已经是0了。

MySQL的刷脏页策略相关推荐

  1. 刷脏页策略linux,【随笔】Linux刷脏页

    一.脏页的由来 前情摘要: 1. 在多级存储系统中,上一级高速设备会成为下一级低速设备的缓存.相较之内存,磁盘是一个低速设备,因此Linux中会通过一种叫"磁盘高速缓存"的软件机制 ...

  2. 刷脏页策略linux,linux – 生成大量脏页阻止同步写入

    我们有进程对大文件进行后台写入.我们希望那些对其他流程的影响最小. 这是在SLES11 SP4上实现的测试.服务器有大量内存,允许它创建4GB的脏页. > dd if=/dev/zero of= ...

  3. mysql什么情况会刷脏页_mysql-刷脏页(12)

    一,mysql因为WAL机制,在更新时,首先会更新内存,再写redo log.一般情况下是在空闲时,将redo log刷新到磁盘中. 二,什么是脏页.当内存中与磁盘中的数据不一致时,内存中的数据页就称 ...

  4. 《MySQL实战45讲》——学习笔记12 “InnoDB刷脏页的控制策略“

    本篇介绍MYSQL InnoDB的WAL机制带来的小问题--利用WAL技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能,但也带来了内存脏页的问题: 脏页会被后台线程自动flush,也会由于数 ...

  5. mysql刷脏页的原理_Mysql脏页flush及收缩表空间原理解析

    mysql脏页 由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,就返回给客户端, 即更新成功. 把内存里的数据写入磁盘的过 ...

  6. mysql怎么查看刷脏页慢_一条SQL查询语句极为缓慢,如何去优化呢

    一条 SQL 查询语句执行的很慢,那是每次查询都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?可以分以下两种情况来讨论. 大多数情况是正常的,只是偶尔会出现很慢的情况. 在数据量不变的情况下,这条 ...

  7. mysql ssd 刷脏,InnoDB的刷脏机制

    Page Cleaner InnoDB 通过独立的线程将Buffer Pool中的脏页刷入存储中.这些线程称作Page Cleaner. Page Cleaner的线程数量通过系统参数--innodb ...

  8. mysql ssd 刷脏_MySQL-Innodb-批量刷脏的场景

    buf_flush_page_cleaner_coordinator协调线程的主循环主线程以最多1s的间隔或者收到buf_flush_event事件就会触发进行一轮的刷脏. 批量刷脏主要有3个场景. ...

  9. MySQL 07、脏页的处理及更新频率 跟 数据库表的空间正确回收

    你的SQL语句为什么变"慢"了 在 前文 中介绍了WAL机制.现在你知道了,InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作.这个日志叫作redo log(重做日志), ...

  10. Mysql - 脏页刷新机制

    什么是脏页? Mysql InnoDB表基本都是基于B+树索引进行存储的,而数据存储的最小单元就是数据页(物理存储结构:表 -> 表空间(和索引)-> 段 -> 区 -> 页 ...

最新文章

  1. java获取content-disposition_java – Content-Disposition附件不起作用 – 将...
  2. androidid什么时候会变_今天是“三九”为什么老话说:三九冰上走一走,过年也能露一手!...
  3. java 图形立即显示_java 图形显示
  4. git提交过滤package.json_eclipse配置git环境以及使用git提交本地仓和远程仓
  5. (31)FPGA原语设计(IBUFG)
  6. 计算机考研专业基础知识视频教程链接
  7. O(1) O(n)
  8. 扫描局域网IP和MAC的有力工具BPSNMPUtil
  9. 对 粒子滤波算法原理 的介绍,通俗易懂
  10. 滚动轴承的代号表示方法
  11. 怎么建立局域网_智能电视局域网共享怎么操作?多数品牌都适用的方法!
  12. 如何玩转互联网金融大数据——征信
  13. AtCoder Beginner Contest 175 A Rainy Season 字符串+5种情况
  14. Faulty Odometer(进制转化)
  15. 遍历目录 nftw and ftw
  16. 微信小程序记录与项目实践
  17. SSL,HTTPS,数字证书 是什么?
  18. 高性价比降噪耳机推荐,2023年降噪耳机排行榜推荐
  19. 解决can't resolve the symbol 'R'方法(转载)
  20. 科研速记(2):ICCV19-Wavelet Domain Style Transfer for an Effective Perception-distortion Tradeoff

热门文章

  1. LeetCode-121. 买卖股票的最佳时机(java)
  2. RuntimeError: mat1 dim 1 must match mat2 dim 0 报错解决
  3. MOSS入门介绍 和 概念介绍
  4. codevs 4939 欧拉函数
  5. dvanced Installer Architect
  6. 爬完点评爬某东,爬他个600多本书籍资料
  7. 如何在命令行下用命令slmgr激活windows8系统
  8. 传奇服务器常见的网络攻击方式有哪些?-版本被攻击
  9. C/C++银行账户管理系统
  10. 国外 2D 游戏引擎相关站点