Mysql 缓冲
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 缓冲相关的知识,希望对你有一定的参考价值。
1 缓冲池(buffer pool)
缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX"在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。对于数据库中页的修改操作,则首先修改在缓冲池中的页,然后再以- -定的频率刷新到磁盘上。这里需要注意的是,页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过- -种称为Checkpoint的机制刷新回磁盘。(来自mysql技术内幕定义)
缓冲池中缓存的数据页类型有主要是索引页、数据页、undo 页等等,不能简单地认为,缓冲池只是缓存索引页和数据页。
缓冲池(buffer pool)中的数据如何刷到磁盘中?
利用checkpont机制 将缓冲池中的脏页刷回磁盘,有两种方式
1 Sharp Checkpoint:将脏页都刷回磁盘,用在数据库关闭时
2 Fuzzy Checkpoint:刷部分脏页数据回磁盘,用在数据库运行时触发Fuzzy Checkpoint的情况
Master Thread Checkpoint :Master Thread 差不多以每秒或每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘
FLUSH_LRU_LIST Checkpoint : 如果LRU列表中没有足够的空闲页,就会将列表尾端的页移除,如果这些页中有脏页,就将这些脏页刷回磁盘。
Async/Sync Flush Checkpoint:当redo log file写满了之后 需要强制将一些脏页刷回磁盘。
Ditry Page too much Checkpoint :脏页如果太多了(可以配置,一般是脏页占缓冲池的75%),也会强制将一些脏页刷回磁盘
如何查询数据?
1 先查询缓冲池中有没有,如果有直接返回
2 如果缓冲池没有,从磁盘加载到缓冲池,在change buffer 如果有合并返回
如何写操作?
1 如果在缓冲池中有,直接修改
2 如果缓冲池中没有,修改的数据是否为主键或者唯一索引 如果不是写入change buffer,如果是 从磁盘加载数据导缓冲池,修改
更多请阅读:https://mp.weixin.qq.com/s/nA6UHBh87U774vu4VvGhyw
2 重做日志缓冲(redo log buffer)
InnoDB存储引擎的内存区域除了有缓冲池外,还有重做日志缓冲(redo log buffer)。InnoDB 存储引擎首先将重做日志信息先放人到这个缓冲区,然后按一定频率将其刷新到重做日志文件。重做日志缓冲一般不需要设置得很大,因为一般情况下每一-秒钟会将重做日志缓冲刷新到日志文件,因此用户只需要保证每秒产生的事务量在这个缓冲大小之内即可。.
数据如何刷到缓冲日志文件(redo log file)?
从redo log buffer写日志到磁盘的redo log file中,过程如下:
有三种方式:
1 Master Thread每1秒或10秒将重做日志缓冲刷新到重做日志文件;
2 每个事务提交时会将重做日志缓冲刷新到重做日志文件;有三种策略如图
3 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件。
3 写缓冲(change buffer)
仅适用于非唯一普通索引页呢
有哪些场景会触发将写缓冲中的数据刷到缓冲池在中?
1 数据页被访问。
2 当缓冲池中的数据需要刷新到磁盘的时候。
更多请阅读:https://mp.weixin.qq.com/s/PF21mUtpM8-pcEhDN4dOIw
4 double write buffer
解决“页数据损坏”的问题呢
更多请阅读:https://mp.weixin.qq.com/s/bkoQ9g4cIcFFZBnpVh8ERQ
以上是关于Mysql 缓冲的主要内容,如果未能解决你的问题,请参考以下文章