MYSQL学习笔记---抖动一下

有时在正常情况下,工作的很好的SQL语句,突然就变慢了一下。MYSQL发生了抖动,这是什么原因?
首先从MYSQL的wal机制说起。
INNODB在处理更新语句的时候,只是写了一次redo log就返回了。
那么就会产生“胀页”。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
产生了胀页,就要找时间进行flush,把内存的数据刷入到磁盘里面,保持数据的一致。
以赊账的例子来看:
在这里插入图片描述
那么发生MYSQL抖动一下的情况,可能就是在刷胀页。
什么情况下MYSQL会刷胀页呢?
1 redo log满了,那么check point 就要往前移动。给redo long留出空间,同时会暂停所有的更新操作。
2 内存不够用了,要留出内存给其他的数据页使用,那么如果淘汰的是胀页,那么就需要刷盘。
内存里存在的,表示内存就是正确的数据,直接返回
内存里不存在的,表示数据文件里面的就是正确的数据。读入内存返回,
这样做的效率最高。
3 只要当mysql认为系统空闲的时候,或者在系统忙的时候找个时间点刷一下盘
4 正常关闭MYSQL的时候
对性能的影响
第三是在系统空闲的时候,第四是正常关闭的时候,这两种情况都不会产生性能问题。
第一种是在redo log写满的时候,这是所有的更新操作都不能进行,从监控看就是更新数跌到了0
第二种是常态,内存不够用了,要先将脏页写到磁盘。InnoDB 用缓冲池(buffer pool)管理内存,缓冲池中的内存页有三种状态:
1 还没有使用的;
2 使用了并且是干净页;
3 使用了并且是脏页。
Innodb策略是会尽量的使用内存,当长时间使用的时候,没有被使用的页面是很少的。当需要读取的数据页不在内存的时候,就会在缓冲池申请一个。那必然要把最长没有使用到的页面替换。如果是干净页,那么直接复用,如果是胀页,那必须要刷入磁盘。
当:
1 一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长;
2 日志写满,更新全部堵住,写性能跌为 0,这种情况对敏感业务来说,是不能接受的。
这都会影响性能。
控制策略
刷胀页的数度影响的两个因素:
1 胀页的比例,不要超过75%,
胀页的比例通过 Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total 得到。

mysql> select VARIABLE_VALUE into @a from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
select VARIABLE_VALUE into @b from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
select @a/@b;	
``
	innodeb会根据胀页的比例算出0-100范围之间的数组。	
	2 redo log写满
	算法:

在这里插入图片描述

	磁盘的IOPS会影响刷盘的速度。把innodb_io_capacity调成IOPS一样		
  • fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
    在innode种,如果旁边的页面也是胀页,就会把旁边的页面一起刷掉。通过innodb_flush_neighbors来控制。
    在机械硬盘时代是有意义的,减少随机IO。但是SSD的IOPS不是瓶颈,所以可以关掉,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值