第五篇:MySQL之缓冲池(buffer pool)和写缓冲(change buffer)

1、buffer pool

buffer pool的优点
buffer pool是MySQL在内存中开辟的一片区域,用来存放磁盘中的数据页。

利用redolog和buffer pool可以提高读取效率。

当要读取的数据页在buffer pool中,直接在内存中读取得到,不用再读取磁盘。如果要修改数据页,将相关日志顺序写道redo log file中。

buffer pool的管理算法

MySQL中的buffer pool采用的改进版的LRU算法。

MySQL在从磁盘往内存中读取数据页时,会额外读取周围的数据页,这叫做预读。由于程序局部性原理,一个数据页周围的局部数据用到的概率很大,一次性读取多个数据页比一个一个的读取数据页的效率要高。

但是有的时候会预读失败,也就是预读到的数据页没有用上,占用了宝贵的缓冲池资源。

我们希望预读失败的数据页尽快被淘汰。

MySQL对LRU进行了改进,将LRU链表分为了两部分:新生代和老生代。
第五篇:MySQL之缓冲池(buffer pool)和写缓冲(change buffer)_第1张图片

新生代和老生代首尾相连

当新数据页调入buffer pool时,将其加入到老生代的头部,当数据再次被访问时,才会加入到新生代头部

change buffer

对于一个没有在buffer pool中的数据页,但我们需要修改的时候,普通的做法是:
1、将数据页调入到buffer pool中, 一次随机磁盘IO
2、更新buffer pool中的数据 , 一次内存IO
3、将修改写入redo log,一次磁盘顺序写IO

对于那种写多读少的场景,这种做法无疑效率低下。

可以按照以下策略优化:
1、将修改的操作写入到change buffer中 ,一次内存IO
2、写入日志到redolog中, 一次磁盘顺序写IO

减少了最耗时的随机磁盘IO

会不会造成数据丢失和不一致?
:不会,修改数据写入到了redolog,不会造成数据丢失

当数据页读取的时候的做法:
1、从磁盘中将数据页调入到buffer pool中
2、读取change buffer中相关的操作,更新数据页

change buffer 不适用的场景:

1、更新的数据存在唯一索引
因为唯一索引要保证数据唯一性检查,要全局扫描表。此时该数据页一定会调入到buffer pool中。change buffer就属于多余操作了。

2、数据页更新后,立即会被读取

change buffer适合 写多读少的场景,并且满足非唯一索引

你可能感兴趣的:(MySQL,mysql,数据库)