首页 > 数据库 >12 | 为什么我的MySQL会“抖”一下?

12 | 为什么我的MySQL会“抖”一下?

时间:2023-06-29 22:45:46浏览次数:40  
标签:为什么 12 flush innodb MySQL 磁盘 脏页 pages

一下内容出自 《MySQL 实战 45 讲》

12 | 为什么我的MySQL会“抖”一下?

一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。看上去,这就像是数据库“抖”了一下。

这个时候,MySQL 可能是在刷脏页(flush)。

引发数据库 flush 的情况

1、InnoDB redo log 写满了。这时候系统会停止所有的更新操作,把 checkpoint 往前推进,redo log 留出空间可以继续写。

2、系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是 “脏页”,就要先将脏页写到磁盘。

3、MySQL 认为系统空闲的时候。

4、MySQL 正常关闭。MySQL 会把内存的脏页都 flush 到磁盘上。

刷脏页虽然是常态,但是出现以下这两种情况,都是会明显影响性能的:

1、一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长;

2、日志写满,更新全部堵住,写性能跌为 0,这种情况对敏感业务来说,是不能接受的。

InnoDB 刷脏页的控制策略

1、参数innodb_io_capacity: InooDB 根据这值判断磁盘能力,建议你设置成磁盘的 IOPS。

innodb_io_capacity 的默认值为 200,所以如果主机磁盘用的是 SSD,建议改为大,如 20000.

如果设置的过低,InnoDB 认为系统的能力差, 刷脏页刷得特别慢,甚至比脏页生成的速度还慢,这样就造成了脏页累积,影响了查询和更新性能。

2、参数 innodb_max_dirty_pages_pct 是脏页比例上限,默认值是 90%。

脏页比例是通过 Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total 得到的。

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、参数 innodb_flush_neighbors 控制是否刷邻居的脏页,默认值为 0。

即:在准备刷一个脏页的时候,如果这个数据页旁边的数据页刚好是脏页,就会把这个“邻居”也带着一起刷掉;而且这个把“邻居”拖下水的逻辑还可以继续蔓延,也就是对于每个邻居数据页,如果跟它相邻的数据页也还是脏页的话,也会被放到一起刷。

这个参数在机械盘时代比较有用,可以减少很对随机 IO。

对于 SSD 这类 IOPS 比较高的设备,建议设置为 0,因为这时候 IOPS 往往不是瓶颈。

标签:为什么,12,flush,innodb,MySQL,磁盘,脏页,pages
From: https://www.cnblogs.com/sun-yanglu/p/17515387.html

相关文章

  • 西门子1200PLC的MODBUS_RTU轮询程序
    西门子1200PLC的MODBUS_RTU轮询程序,代码成熟,已经运用在多个项目中,自己用SCL语言编写,可以实现以下功能:1、在线更改波特率,奇偶校验等,不用修改程序,免去反复下载程序的麻烦2、可以自由添加读写数据,无需重复下载程序;3、可以自定义数据处理4、可实时开启或关闭对某一数据的读写5、......
  • ubuntu 18.04.1安装mysql8
    sudoaptupdatesudoaptinstallmysql-serversudosystemctlstatusmysqlsudomysqlALTERUSER'root'@'localhost'IDENTIFIEDWITHmysql_native_passwordBY'password';FLUSHPRIVILEGES;createuser'testuser'@......
  • C#上位机 APP监控西门子PLC S7-1200 1,C#开发上位机手机APP,自己写的程序可提供部分
    C#上位机APP监控西门子PLCS7-1200 1,C#开发上位机手机APP,自己写的程序可提供部分2,通过VS2019开发安卓手机app3,全套源代码,现场运行设备实测有效。4,完整项目代码,拿来就可实际应用5,项目完整架构,本项目是针对起重机高空不易维护问题开发的6,功能完善,数据库,语音报警,数据报表都有......
  • React - 12 Hooks组件之useState
    1.hooks组件本质是函数组件2.useState①基础用法importReact,{useState}from"react";import{Button}from'antd';/*useState:ReactHook函数之一,目的是在函数组件中使用状态,并且后期基于状态的修改,可以让组件更新let[num,setNum]=useState(initialValue);......
  • 【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • eggjs连接MySQL数据库
     前言:eggjs连接MySQL数据库,我摸索了各种方式。下面这篇文章能正确链上。 我犯过的几个错误:1,config/plugin.js中我填写错误,这是最致命的,导致直接读不到MySQL。官方文档不靠谱,如下所示//config/plugin.jsexports.mysql={  enable:true,  package:'egg-mysql',};......
  • mysql通过表分区来增加数据查询效率
    背景我们mysql是单机,其中有几个表体积会很大,需要做分表来增加查询效率.我们的数据是连续不断入库的,查询条件是一个批次一个批次的查,也可以看做是按时间段查询.思路mysql事件Event:到一定时间把原表改名,加一个后缀,比如user表改为user_1RENAMETABLEdivision_stop_......
  • 12. 强制类型转换
    目录1.Defination2.整数提升3.常用的算术转换1.Defination  即把数据类型转换成另一种数据类型,例如这么一种情况,你想把long类型的数据,保存成int类型数据,那么你就需要将其进行强制类型转换。可以使用强制类型转换运算符来把值显示的转换成另一种数据类型。(type_name)expr......
  • MySQL 8.0.33 my.ini说明
    #其他默认调整值#MySQLServer实例配置文件#-------------------------------------------------------------------------------------------------------------------------------------------------------------#由MySQLServer实例配置向导生成###安装说明#------------......
  • mysql: [Warning] Using a password on the command line interface can be insecure.
      https://zhuanlan.zhihu.com/p/542166965 ......