(1)Buffer Pool区域能否在运行期间动态调整大小呢?
如果按照上述的基于分配Buffer Pool 内存的方式是无法进行动态调整的,如果本来8GB,运行期间调整成了16GB,此时怎么实现?
那这个时候向操作系统申请一块新的16GB的连续内存,
然后把现在Buffer Pool所有缓存页,描述数据块,各种链表,都拷贝的16GB的内存中去。这个过程是极为耗时的,性能很低下,无法接收。
(2)如果基于chunk机制把Buffer Pool给拆小?
MySQL做了一些优化,设计了chunk机制,Buffer Pool是由很多chunk组成,大小是 innodb_buffer_pool_chunk_size 参数控制,默认值是 128 MB。
比如我们给Buffer Pool设置一个总大小8GB,然后有4个Buffer Pool,那么每个Buffer Pool就是2GB,此时每个Buffer Pool是由一系列的128MB的chunk组成的,也就是每个Buffer
Pool会有16个chunk,然后每个Buffer Pool里的每个chunk里就是一系列的描述数据块和缓存页,每个Buffer Pool里的多个chunk共享一套free,flush,lru链表。
(3)基于chunk机制如何支持运行期间,动态的调整Buffer Pool大小?
假设我们Buffer Pool现在的总大小是 8GB,现在要动态的添加到 16GB,那么此时只需要是申请一系列的128MB大小的chunk就可以了,只要每个chunk是连续的128MB内存就行了。然后把
这些申请到的chunk内存分配给buffer pool。有了chunk机制,此时并不需要额外的申请16GB的连续内存空间,然后还要把已有的数据进行拷贝。
其实Buffer Pool的数据结构呢,又加了一层,Buffer 是由 一个个的 chunk 块组成的。