其实MySQL的LRU链表做了优化,数据67是不会往前跑的 。
四、假设你修改了某数据页
假设你执行了update xxx set xxx where id in (xxx,xxx,xxx,xxx);
而符合条件的数据行恰巧就在描述信息1、描述信息66、描述信息67所指向的缓存页中,那BufferPool中会发生什么呢?
如下图:
文章插图
你会看到,被你修改了的缓存页的描述信息,被添加到了FlushList这个双向链表中 。
想必看到这里你已经知道了,原来FlushList中的节点存放就是被修改了脏数据页的描述信息块 。
随着MySQL被使用的时间越来越长,BufferPool的大小就越来越小 。等它不够用的时候,就会将部分LRU中的数据页描述信息移除出去,这时如果发现被移除出来的数据页在FLushList中,就会触发fsync的操作,触发随机写磁盘 。如果该数据页是干净的,那移除出去就好了 。其他也不用干啥 。
举个例子:假设需要将描述信息66、描述信息67指向的缓存页落盘 。会得到下面这张脑图:
描述信息66、67指向的缓存页被刷新进磁盘 。同时从FlushList中将其移除,然后存入FreeList中 。完成一个循环
文章插图
当然,将脏数据页刷新进磁盘的时机除了上图中说的还有好多种情况 。
下面再看一下关于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实例状态 。
文章插图
七、揭秘BufferPool的真实结构
现实中Buffer Pool动辄就占用好几G的内存,相对于直接申请几G的内存完成扩容,MySQL有更优雅的实现方式 。
为了实现动态调整Buffer Pool的大小 。MySQL设计了chunk 机制 。
文章插图
可以看上图脑补一下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
推荐阅读
- 备份MySQL数据库的方法
- 当你还在讨论分析ChatGPT,有人开始用它“搞钱”了
- MySQL是如何解决幻读问题的?
- 求职|当你懂得怎样为自己加分的时候,那你就不用害怕失败了
- mysql误删表如何恢复,恢复被删除表的步骤说明
- 在历练中选择坚强
- 电脑屏幕录制软件排行,屏幕录制软件哪个更好
- MySQL自我保护参数
- MySQL的ibtmp1文件怎么这么大?
- MySQL MaxCompute与AnalyticDB实现数据处理与转换过程