前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你的MySQL为什么会"抖"一下?

你的MySQL为什么会"抖"一下?

作者头像
AsiaYe
修改2020-05-19 09:43:27
9500
修改2020-05-19 09:43:27
举报
文章被收录于专栏:DBA随笔DBA随笔

今天分享的内容是MySQL为什么有时候会“抖一下”?

在现实工作中,偶尔能碰到执行SQL语句的时候突然卡一下,这样的场景不容复现,但是出现的时候确实让人奇怪,今天我们就来看这个情况可能产生的场景。

场景1、redo log 写满的时候(少见)。

当MySQL的redo log写满的时候,也就是write pos追上checkpoint的时候,(这里我们搬过来之前的那张图):

此时系统会停止所有的更新操作,将checkpoint的位置往前推进,而推进checkpoint的过程,需要将数据脏页flush到磁盘上。

场景2、MySQL内存不够用了,需要将一部分脏页写到磁盘上

这种情况是比较常见的,当我们要读取的数据页不在buffer pool中的时候,就需要将数据页加载到buffer pool中,如果此时buffer pool不够用,则会将最久不适用的数据页从内存中淘汰掉。如果此时淘汰的是脏页,那么久需要做刷磁盘的操作。如果在一个查询中,需要刷新到磁盘上的脏页非常多,那么该查询SQL的响应时间就会相对比较长。

以上两种情况,都有内存和磁盘的交互过程,而这个交互过程本身比较慢,另一方面,刷脏页的逻辑会占用磁盘的IO资源,还会导致我们的更新操作变慢,所以会导致MySQL看起来像"抖"了一下。

场景3、内存数据页刷盘过程中的额外开销

除了刷盘本身带来的性能影响之外,innodb的另外一个机制也会导致原本的性能更低下。在从内存中往磁盘上刷新脏页的时候,如果这个数据页的旁边刚好是一个脏页,那么innodb会'连带'着旁边的脏页一起刷盘,而这个动作可能一直蔓延,"让本来就不富裕的家庭雪上加霜".

如何缓解内存刷盘慢这种情况?

1、脏页控制策略---刷盘速率

当我们明确告知MySQL系统的磁盘能力,这有助于MySQL正确的执行落盘操作。innodb_io_capacity参数可以告诉Innodb系统磁盘的能力。一般情况下,该值建议设置成磁盘的IOPS,如何获取?可以使用fio这个工具。

例如在SSD盘上,可以将该参数设置的稍微大点,这样能有利于提升MySQL的刷盘性能。如果设置的过小,InnoDB认为这个系统的能力就这么差,所以刷脏页刷得特别慢,甚至比脏页生成的速度还慢,这样就造成了脏页累积,影响了查询和更新性能。

2、脏页刷盘条件---脏页比例

在Innodb中,脏页比例和redo log的写盘速度会影响脏页的刷盘效率。其中,脏页比例通过参数innodb_max_dirty_pages_pct,它表示脏页比例上限,默认值是75%,一旦超过这个值,那么Innodb就会主动的发起刷盘的动作,而不必等到100%的情况发生。

高质量Q && A

Q1:刷新脏页的时候,脏页在redo log中的位置是随机的,这样就需要把redo log的不同位置给刷新掉,此时是否会对redo log做合并间隙,移动位置的操作?

redo log的优势是将磁盘的随机写转换成内存的顺序写,刷脏页的时候就是在redo log中随机读写了么?

A1:刷新脏页的时候,是不用动redo log文件的。redo log在重放的过程中,如果一个数据页已经刷新到磁盘,innodb会识别出来,并跳过这个数据页的redo log。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-12,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com