MySQL当你CRUD时BufferPool中发生了什么?( 二 )


 
 
其实MySQL的LRU链表做了优化,数据67是不会往前跑的 。
 
 
四、假设你修改了某数据页 
 
假设你执行了update xxx set xxx where id in (xxx,xxx,xxx,xxx);
 
 
而符合条件的数据行恰巧就在描述信息1、描述信息66、描述信息67所指向的缓存页中,那BufferPool中会发生什么呢?
 
 
如下图:
 

MySQL当你CRUD时BufferPool中发生了什么?

文章插图
 
你会看到,被你修改了的缓存页的描述信息,被添加到了FlushList这个双向链表中 。
 
 
想必看到这里你已经知道了,原来FlushList中的节点存放就是被修改了脏数据页的描述信息块 。
 
 
随着MySQL被使用的时间越来越长,BufferPool的大小就越来越小 。等它不够用的时候,就会将部分LRU中的数据页描述信息移除出去,这时如果发现被移除出来的数据页在FLushList中,就会触发fsync的操作,触发随机写磁盘 。如果该数据页是干净的,那移除出去就好了 。其他也不用干啥 。
 
 
举个例子:假设需要将描述信息66、描述信息67指向的缓存页落盘 。会得到下面这张脑图:
 
 
描述信息66、67指向的缓存页被刷新进磁盘 。同时从FlushList中将其移除,然后存入FreeList中 。完成一个循环
 

MySQL当你CRUD时BufferPool中发生了什么?

文章插图
 
当然,将脏数据页刷新进磁盘的时机除了上图中说的还有好多种情况 。
 
 
下面再看一下关于Buffer Pool的设置和相关的优化 。
 
 
五、配置Buffer Pool的大小 
 
buffer pool越大,MySQL的性能就越强悍 。你可以像下面这样配置Buffer Pool的大小 。
 
 
Copymysql> SET GLOBAL innodb_buffer_pool_size=402653184; 
 
六、配置多个Buffer Pool的实例 
 
你可以为MySQL实例配置多个Buffer Pool,每个Buffer Pool各自负责管理一部分缓存页,并且有自己独立的LRU、Free、Flush链表 。
 
 
当有多线程并发请求过来时,线程可以在不同的Buffer Pool中执行自己的操作,MySQL性能就会得到很大的提升
 
 
在my.d中进行配置
 
 
Copy[server]innodb_buffer_pool_size = xxxinnodb_buffer_pool_instances = 4 
 
意思是将总容量为xxx的buffer pool划分成4个实例 。每个实例都有 xxx/4 的容量 。
 
 
参数innodb_buffer_pool_instances的最大值为64,并且想让该参数生效,innodb_buffer_pool_size容量至少是1G 。
 
 
可以像下面这样查看你的MySQL的Buffer Pool实例状态 。
 

MySQL当你CRUD时BufferPool中发生了什么?

文章插图
 
七、揭秘BufferPool的真实结构 
 
现实中Buffer Pool动辄就占用好几G的内存,相对于直接申请几G的内存完成扩容,MySQL有更优雅的实现方式 。
 
 
为了实现动态调整Buffer Pool的大小 。MySQL设计了chunk 机制 。
 

MySQL当你CRUD时BufferPool中发生了什么?

文章插图
 
可以看上图脑补一下Buffer Pool 以及 Chunk长什么样 。
 
 
总的来说:就是将每一个 Buffer Pool Instance 更加细力度化 。将Buffer Pool拆分成更小的独立单元 。
 
 
每个Buffer Pool划分成多个chunnk,每个chunk中维护一部分缓存页、缓存页的描述信息 。同属于一个Buffer Pool的chunk共享该Buffer Pool的lru、free、flush链表 。
 
 
块大小由参数innodb_buffer_pool_chunk_size控制,默认值为 128M
【MySQL当你CRUD时BufferPool中发生了什么?】 
 
该参数可以像下面这样修改:
 
 
Copyshell> mysqld --innodb-buffer-pool-chunk-size=134217728 
 
或者通过配置文件自定义
 
 
Copy[mysqld]innodb_buffer_pool_chunk_size=13421772 
 
八、看一看Buffer Pool相关的参数# 
 
执行命令
 
 
Copy> mysql show engine innodb status 


推荐阅读