MySql“抖”一下
2020-06-16 10:25:31 0 举报
AI智能生成
分析MySQL运行过程中有时候会变慢的原因
作者其他创作
大纲/内容
起因
数据库SQL语句执行时快时慢,并且慢的场景很难复现,持续时间很短
原因分析
WAL(Write-Ahead Logging)机制
先写日志(redo log)更并更新到内存返回结果,空闲的时候在写磁盘
脏页
当内存数据页和磁盘数据页数据内容不一致的时候称为脏页
干净页
当内存写入磁盘,两者内容一致的时候称为干净页
所有MySQL偶尔“抖”一下,原因可能就是在刷脏页(flush)
刷脏页其实就是将脏页数据写入磁盘,脏页变成干净页可以继续使用
引发“抖动”场景
日志(redo logo)写满,需刷脏页
日志写满以后,系统会停止所有操作来腾出日志空间保证继续写入,这种情况应尽量避免
系统内存不够用,需将脏页内容写入磁盘,这种情况其实是常态
系统空闲的时候会flush脏页到磁盘
MySQL正常关闭的时候,系统flush脏页到磁盘,下次启动的时候直接从磁盘读取数据,提高启动速度
刷脏页控制策略
为什么要控制
一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长
日志写满,添加/更新操作全部堵住,写性能跌为 0,这种情况对敏感业务来说,是不能接受的
策略参数
innodb_io_capacity
设置innodb系统磁盘IO能力,建议设置成磁盘的 IOPS
刷脏页速度
脏页比例(innodb_max_dirty_pages_pct)
脏页比例上限,MySQL会根据当前脏页比例计算出一个0-100的数字
redo log 写盘速度
InnoDB 每次写入的日志都有一个序号,当前写入的序号跟 checkpoint 对应的序号之间的差值,
MySQL会根据这个值计算出一个0-100的数字
MySQL会根据这个值计算出一个0-100的数字
连坐机制
flush脏页的时候,如果旁边的数据也是脏页,也会被一并刷掉,如果周围还有脏页,那也一起刷掉,只要有脏页,这个机制就一直延续
innodb_flush_neighbors=1的时候会有连坐机制,机械硬盘下使用有必要,可以减少随机IO次数
innodb_flush_neighbors=0不会有该机制,只刷自己的脏页,SSD硬盘下面可以设置,可以加快耍脏页速度
合理地设置 innodb_io_capacity 的值,并且平时要多关注脏页比例,不要让它经常接近 75%
收藏
0 条评论
下一页