1、为什么 SQL 会变慢

在我们平时工作的时候,有时候会发现,同一条 SQL 语句,在正常执行的时候特别快,但有时候不知道为什么,它就会变慢,并且这样的场景很难复现。是什么导致了 SQL 语句变慢了呢?

我们在 一条 SQL 更新语句是如何更新的 中,知道了 WAL 机制,InnoDB 在处理更新语句的时候,只是做了一个写日志的磁盘操作,这个日志叫做 redo log,更新内存写完 redo log 之后,就会返回给客户端,这次更新成功

什么是 flash

在 redo log 记录的差不多后,会把内存中的数据写入磁盘中,这个过程叫做 flush,在这个 flush 操作执行之前,内存数据页跟磁盘数据页内容不一致,我们称这个内存页为脏页,内存数据写入到磁盘中后,内存和磁盘上的数据页内容一致,称为干净页

我们知道了这些后,很容易能想到,平时执行很快的更新操作,其实就是在写内存和日志,而 SQL 突然变慢的时候,可能就是在(flush)刷脏页

2、什么情况下会触发 flash 过程

  • 第一种情况是如果 redo log 写满了,在这个时候,系统会停止所有更新操作,把脏页数据 flush 到磁盘上,然后 checkpoint 往前推进,redo log 留出空间可以继续写下去。
  • 第二种场景是,系统内存不足,当需要新的内存页,而内存不够的时候,就需要腾出来一些数据页,空出内存供其它数据页使用,如果是脏页的话,就要先将脏页写到磁盘
  • 第三种场景是,在系统比较空闲的时候,MySQL 会将一些脏页写到磁盘中去,系统也没什么压力
  • 第四种场景,如果 MySQL 正常关闭的时候,会将所有的脏页都刷到磁盘上

第一种情况是我们要尽量避免的,出现这种情况的话,整个系统就不能接收更新了

第二种情况其实比较常见,InnoDB 使用缓冲池(buffer pool)管理内存,缓存池中的内存有三种状态(还未使用的,使用了并且是干净页,使用了并且是脏页),InnoDB 的策略是尽量使用内存,对一个长时间运行的库来说,没有被使用的页会很少,但是出现以下两种情况,都会影响性能

  • 一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长
  • 日志写满,更新全部堵住,写性能跌到 0

3、InnoDB 刷脏页的控制策略

innodb_io_capacity 这个参数控制的是 InnoDB 的磁盘能力,我们可以将这个值设置为磁盘的 IOPS,磁盘的 IOPS 可以通过 fio 这个工具来测试

innodb_max_dirty_pages_pct 是脏页比例上线,默认是 75%,我们要合理的设置 innodb_io_capacity 的值,并且多关注脏页比例,不要让它接近 75%

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

一旦一个查询请求需要值执行过程中先 flush 掉一个脏页时,这个查询就可能比平时慢了,MySQL 中有一个机制,可能会使查询更慢:

在准备刷一个脏页的时候,如果这个数据页旁边的数据刚好是脏页,就会把相邻的脏页也一起刷掉,这个逻辑可以继续蔓延下去

在 InnoDB 中,innodb_flush_neighbors 参数就是用来控制这个行为的,值为 1 的时候会有上述行为,值为 0 的话只会刷新自己,MySQL 8.0 中默认是 0

从头开始搞懂 MySQL(07)为什么同一条 SQL 时快时慢相关推荐

  1. 丁奇mysql45讲百度云下载_MySQL实战45讲,丁奇带你搞懂MySQL【完结】

    开篇词.这一次,让我们一起来搞懂MySQL.mp3 开篇词.这一次,让我们一起来搞懂MySQL.pdf 01.基础架构:一条SQL查询语句是如何执行的?.mp3 01.基础架构:一条SQL查询语句是如 ...

  2. 学习最新大厂付费视频时整理的万字长文+配图带你搞懂 MySQL

    万字长文+配图带你搞懂 MySQL MySQL SQL的介绍 SQL分类 MySQL语法 创建数据库 修改.删除.使用数据库 DDL查询数据表 DDL创建数据表 修改数据表结构 删除数据表 DML添加 ...

  3. mysql decimal型转化为float_5分钟搞懂MySQL数据类型之数值型DECIMAL类型

    速成指南 5分钟搞懂MySQL数据类型 之数值型--DECIMAL类型 DECIMAL类型的语法:DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL].其中M指定的是数字的总位 ...

  4. 图文结合带你搞懂MySQL日志之Error Log(错误日志)

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 作者:KAiTO 文章来源:社区原创 往期回顾: 图 ...

  5. mysql 什么树_搞懂MySQL InnoDB B+树索引

    一.InnoDB索引 InnoDB支持以下几种索引: B+树索引 全文索引 哈希索引 本文将着重介绍B+树索引.其他两个全文索引和哈希索引只是做简单介绍一笔带过. 哈希索引是自适应的,也就是说这个不能 ...

  6. 一文搞懂MySQL数据库分库分表

    如果数据量过大,大家一般会分库分表.分库需要注意的内容比较少,但分表需要注意的内容就多了. 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没用过 ...

  7. 一文搞懂 MySQL 索引

    一文搞懂 MySQL 索引 1.MySQL 索引 简介 1.1.MySQL 索引 是什么?  索引是一个单独的.存储在 磁盘 上的 数据库结构 ,包含着对数据表里 所有记录的 引用指针. 1.2. M ...

  8. 一文搞懂MySQL XA如何实现分布式事务

    一文搞懂MySQL XA如何实现分布式事务 前言 XA 协议 如何通过MySQL XA实现分布式事务 前言 MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如 ...

  9. 一文搞懂MySQL的Join

    点击上方 "程序员小乐" ,关注公众号 8点20分,第一时间与你相约 每日英文 A single hand that wipes tears during failures is ...

最新文章

  1. 每日一皮:当你修bug时,是否碰到过这种场景...
  2. Visual Studio 2017最新版正式发布!适用于任何开发人员、平台及APP丨附下载
  3. Win10不能使用Genymotion模拟器的解决方案
  4. flash air 解析html,AIR 程序内部显示网页,并可以点击浏览的方法(HTMLLoader、StageWebView)...
  5. 二、计算机视觉与卷积神经网络
  6. iOS开发UI篇—实现一个私人通讯录小应用(二)
  7. jsencrypt加密同一值返回不同密文_密码学原语如何应用?解析密文同态性的妙用...
  8. NLP《Tranformer和Self-Attention》
  9. Java实现数据批量导入数据库(优化速度-2种方法)
  10. 多精度数带余除法_《有余数的除法》教学设计
  11. 资源集成视角解读项目管理-合同类型
  12. 安装Mendeley后Word中没有出现对应的Mendeley插件
  13. 7.交易开拓者-公式进阶(一)
  14. 美国文件服务器,raksmart美国服务器_新闻中心
  15. three.js 相对坐标的设置
  16. 书签 自动更新浏览器的书签_最有用的书签,可增强您的浏览体验
  17. promise.all的用法讲解。
  18. java中的各行换色_java生成excel文件并且隔行换色。
  19. 电商平台数据可视化Echarts-Vue项目综合练习(黑马pink老师)学习记录
  20. python解释器之PyPy解释器

热门文章

  1. 渗透利器BurpSuite简介
  2. 怎么把m2ts改成mp4
  3. 第九篇:万丈高楼平地起-驱动编程基础知识点
  4. 贝叶斯算法 — 朴素贝叶斯分类器— 过滤垃圾邮件 — 流失用户 — 用户画像
  5. 记一次收到QQ邮箱钓鱼邮件经历
  6. uniApp使用uni.chooseAddress()获取微信收货地址
  7. 2021-09-19婴儿抚触,助力宝宝健康成长
  8. ACC-C++组初赛
  9. 谈一谈linux下线程池
  10. 1207-尝试下载DGL