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