本页讨论:
  • innodb的缓存池是什么?
  • innodb的缓存池有什么作用?
  • 加速读实现原理
  • 加速写实现原理

innodb的缓存池是什么?

InnoDB缓存池,本质上是内存中的一块区域,当数据被访问时,InnoDB会把表数据、索引数据缓存在 buffer pool 缓存池中。

内存数据对象图:

innodb的缓存池有什么作用?

 buffer pool两个最主要的功能:一个是加速读,一个是加速写。

加速读:
当需要访问一个数据page的时候,如果这个page已经在缓存池中,那么就不再需要访问磁盘,直接从缓冲池中获取。

加速写:
当需要修改一个page的时候,先将这个page在缓冲池中进行修改,记下相关的redo log,这个页面的修改就算已经完成了。至于这个被修改的dirty page(脏页)什么时候真正刷新到磁盘,后面会详细讲到。

加速读实现原理


缓存池允许经常使用的数据直接从内存中处理,这加快了处理速度。在专用数据库服务器上,经常将高达80%的物理内存分配给InnoDB缓冲池。

为了提高大容量读取操作的效率,缓冲池被划分成可能包含多行数据的页。为了缓存管理的效率,缓冲池被实现为页的链表; 会使用LRU的延伸算法让很少使用的数据超时。


InnoDB使用(LRU)算法的变体将pool作为list进行管理。当需要向pool中添加新block时,InnoDB将驱逐最近最少使用的block并将新block添加到list的中间。

这种“中点插入策略”将list视为两个子list:
在头部,最近访问过的“新”(或“年轻”)block的子列表。
在尾部,最近访问的“旧”block的子列表。

此算法把查询中大量访问的block放到新子列表中。 旧子列表包含较少使用的block,这些block是驱逐的候选人。

LRU算法默认情况下:3/8的缓冲池专用于旧子列表。列表的中点是新子列表的尾部与旧子列表的头部相交的边界。当InnoDB将block读入缓冲池时,它最初将其插入中点(旧子列表的头部)。

访问旧子列表中的block会使其“年轻”,将其移动到缓冲池的头部(新子列表的头部)。
如果因为查询确实需要而读入block,则第一次访问立刻发生,并且该block变得年轻。
如果由于预读而读入block,则第一次访问不会立即发生(并且可能根本不会发生)。

在数据库运行过程中,没有被访问到的block,会向列表的尾部移动。

新子列表中的block会慢慢变老,因为其他的blocks变新了。
旧子列表中的block也会变老,因为不断有block从中点插入。
最终,长时间未使用的block到达旧子列表的尾部并被逐出。

加速写实现原理










上一篇:InnoDb架构
下一篇:更改缓冲区

成为你想看到的世界变革力量

创建者:万乐荣
最后更新时间 : 2018年9月6日 18:21

评论