(十)为什么sql会抖动?

问题思考:

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

      好像就是数据库抖动了一下!

为什么?

      分析:InnoDB在处理更新语句的时候,只做了写日志这个磁盘操作。这个日志 叫作redo log(重做日志),也就是《孔乙己》里咸亨酒店掌柜用来记账的粉板,在更新内存写 redo log后,就返回给客户端,本次更新成功。

      类比分析:掌柜记账的账本是数据文件,记账用的粉板是日志文件(redo log),掌柜的记忆就是内存掌柜的要更新账本,就是把内存写入写入磁盘的过程,术语就是flush,在flush之前,孔乙己的赊账总额与掌柜的手里的账本是不一致的,现在此时:掌柜的的内存与粉板的数据是不一致的,我们称这个内存页“脏页”;

抖动的原因出来啦:

MySQL 偶尔“ 下的那个瞬间,可能就是在 刷脏页(flush)
继续分析,为什么会出现刷脏页?
     (1)第一种,粉板满了,挤不下了,有人再来赊账,,,,,,需要重新擦掉一些;
              innoDB的redo log满了,系统停止更新,把checkpoint往前推进,redo留出空间继续写;
     (2)第二种,生意太好,要记住的事态多,掌柜的记不住了,赶紧找账本把孔乙己的帐额加进去;
              系统内存不足,需要新的内存页,但是不够用,就要淘汰一些数据页;
     (3)mysql空闲时,有机会就刷一下,这个不影响性能;
     (4)msyql关闭的时候,myslq会把脏页的都flush到磁盘,下次启动,直接读取;也不影响性能;
分析:
      InnoDB 的策略是尽量使用内存,因此对于 个长时间运行的库来说,未被使用的页面很少。
      要避免第一种和第二种;
InnoDB刷脏页的控制策略
InnoDB的刷脏页的控制策略分两步:
(1)设置数innodb_io_capacity提高脏页比例上限;
(2)设置参数innodb_max_dirty_pages_pct,提高脏页比例上限刷脏页速度;
 
发布了241 篇原创文章 · 获赞 31 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_40406929/article/details/102976441