主要有四个原因:mysql的内存满了、redo log日志满了、空闲时间、重启数据库。
一、分析以下四种原因对性能的影响
这种影响在实际线上环境主要是内存和redo log 日志对性能的影响。
1.InnoDB用缓冲池(pool buffer)管理内存,缓冲池中内存页有哪三种状态?
(1)没有使用
(2)使用了有脏内存页(脏内存页:内存的数据和磁盘数据不一致的内存页)
(3)使用了是干净页
2.简单说说在内存满了的时候会怎么处理?
当内存满了时,如果内存中有查询的数据页,就直接返回;没有的话就要淘汰掉最久不使用的数据页,被淘汰的数据页如果是脏页,还会把脏页持久化的磁盘后,空出的内存才能使用。
flush一个脏页时是否使用连坐机制怎么设置?
innodb_flush_neighbors = 1 时会使用连坐机制,一般是机械磁盘使用,连坐意思就是当有数据页是脏页需要持久化后,会判断相邻的数据页是否为脏页,持久化的操作会连续下去,直到没有脏页为止。
innodb_flush_neighbors = 0 时,不会触发连坐机制,一般时ssd固态硬盘使用,因为IOPS(io每秒输入输出量)并不是瓶颈。
二、flush脏页的策略
1.innodb_io_capacity
innodb_io_capacity是InnoDB刷脏页的速度。
引擎怎么控速度的?
引擎怎么控速度主要需要考虑两个因素:一是脏页的比例,二是磁盘的io效率。
选出F1(N)和F2(M)的较大值记录为R
flush速度 = innodb_io_capacity * R%
2.怎么得到脏页比例和磁盘io?
innodb_max_dirty_pages_pct:是脏页比例的上限,默认值是75%。InnoDB会根据当前脏页的比例N,根据函数算法的得到F1(N);
innoDB 每次写入的日志都有一个序号,当前写入的序号跟 checkpoint 对应的序号之间的差值M,根据函数算法的得到F2(M);
三、思考题
一个内存配置为 128GB、innodb_io_capacity 设置为 20000 的大规格实例,正常会建议你将 redo log 设置成 4 个 1GB 的文件。但如果你在配置的时候不慎将 redo log 设置成了 1 个 100M 的文件,会发生什么情况呢?又为什么会出现这样的情况呢?