MySQL OCP888题解063-突然变慢的可能原因
Posted oddrock
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL OCP888题解063-突然变慢的可能原因相关的知识,希望对你有一定的参考价值。
文章目录
1、原题
1.1、英文原题
What are three typical causes of mysql becoming suddenly slow or unavailable?
A、OPTIMIZE TABLE is not executed for the InnoDB tables.
B、A configuration change was made.
C、The hardware includes a single point of failure.
D、The MySQL Query Cache is disabled.
E、The application executes a new untested query.
F、Monitoring has not enabled Performance Schema instruments.
1.2、中文翻译
MySQL突然变慢或不可用的三个典型原因是什么?
A、 对于InnoDB表,不执行OPTIMIZE TABLE。
B、 进行了配置更改。
C、 硬件包括一个单点故障。
D、 MySQL查询缓存已禁用。
E、 应用程序执行一个新的未经测试的查询。
F、 监视尚未启用性能架构工具。
1.3、答案
2、题目解析
2.1、题干解析
本题考查MySQL性能影响的因素。
2.2、选项解析
- OPTIMIZE TABLE会让表的统计信息变准,更有利于索引的选择等优化措施。但由于表的统计信息是随着数据量逐步变化的,并不会突然变差,所以不符合题干说的突然变慢或不可用这一点,所以选项A错误。
- Query Cache已经被废弃了,而且本身作用不大,所以不会突然影响性能,选项D是错误的。
- 监控更不会影响性能,所以选项F是错误的。
3、总结
- OPTIMIZE TABLE会让表的统计信息变准,更有利于索引的选择等优化措施。
- Query Cache已经被废弃了,而且本身作用不大。
- MySQL的performance_schema等监控不会影响性能和正常运行。
MySQL抖动-为什么偶现突然变慢的问题?
现象
一条SQL
语句,正常执行的时候特别快,但是有时变得特别慢,并且这样的场景很难复现,它不只随机,而且支持时间还很短。
你的SQL
语句为什么变"慢"了
当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存上和磁盘上的数据页的内容就一致了,称为"干净页"。
抖动原因
MySQL
在执行更新语句时,在更新内存写完redo log后,就返回给客户端,本次更新完成,Mysql
会在Redo log内存被写完时以及服务器系统内存不足,亦或是负载较低时,会使用flush刷盘操作,把内存里的数据写入磁盘。MySQL
出现抖动时,可能就是在刷脏页。
触发场景
- Redo log被使用完毕,必须要清空一部分,以便后续操作,在清空之前需要将正确的数据写入到磁盘。
- 系统内存不足,需要新的内存页,而内存不够用时,就要淘汰一些数据页,内存不够用时,就要淘汰一些数据页。
MySQL
在认定系统"空闲"时刷脏页。MySQL
正常关闭时,会把内存的脏页都flush到磁盘上。
上述四种场景对性能的影响
场景3属于MySQL
空闲时的操作,这时系统没什么压力,场景4是数据库在即将关闭时出现,不会太关注性能问题。
场景1是redo log写满了,要flush脏页,这种情况是InnoDB要尽量避免的。因为出现这种情况时,整个系统就不能再接受更新了,所有的更新都必须堵住。如果从监控上看,这时更新数会跌为0。
场景2:内存不够用了,要先将脏页写到磁盘,这种情况其实是常态。InnoDB用缓冲池(buffer pool)管理内存,缓冲池中的内存页有三种状态:
- 第一种是,还没有使用的;
- 第二种是,使用了并且是干净页;
- 第三种是,使用了并且是脏页。
InnoDB的策略是尽量使用内存,对于一个长时间运行的库来说,未被使用的页很少。
当要读入的数据页没有在内存的时候,就必须到缓冲池中申请一个数据页。这时候只能把最久不使用的数据页从内存中淘汰掉,如果要淘汰一个干净页,就直接释放出来复用,但是脏数据页就必须将脏页先刷到磁盘,变成干净页后才能复用。
所以,刷脏页虽然是一种常态,但是明显影响性能的有两种:
- 要淘汰的脏页太多
- 日志写满,更新全部堵住,写性能跌为0,这种情况对于敏感业务来说,是不能接受的。
所以,InnoDB 有控制脏页比例的机制和控制redo log
的写盘速度来尽量避免上面的这两种情况。
以上是关于MySQL OCP888题解063-突然变慢的可能原因的主要内容,如果未能解决你的问题,请参考以下文章
MySQL OCP888题解064-通过FLUSH TABLE备份表