如果后台线程刷新的很慢,且有新的页面需要进行缓存,这时候会从LRU链表尾部看看是否有可以直接释放的非脏页,如果不存在那么需要刷盘然后缓存新的页 。
这里我们可以看到buffer pool没用保证修改的数据一定被磁盘持有化,那么事务的持久性如何实现昵,怎么保证mysql服务突然挂了,已经提交的事务不会丢失昵,这就得提到redo log了
七丶多个buffer pool实例在并发量比较大的时候,多个线程操作同一个buffer pool,必然涉及到同步机制,影响到请求的处理速度,所以在buffer pool比较大的时候,会被拆分成多个小的buffer pool,独立进行使用,在高并发的时候不会相互影响(虽然也不能公用彼此的缓存内容)提高并发处理能力 。只有在innodb_buffer_pool_size
设置的buffer pool大小大于1g的时候,通过innodb_buffer_pool_instances
设置的buffer pool实例个数才会生效
八丶动态的扩大缩小buffer pool为了能够在运行的时候动态的扩大缩小buffer pool,innodb提出chunk
的概念,innodb 不在一次申请为某一个buffer pool申请一大片连续的内存空间,而是以chunk作为单位进行申请 。一个chunk就是一个连续的内存空间,其内部包含了若干缓冲页和其对应的控制块 。
文章插图
可以通过
innodb_buffer_pool_chunk_size
设置每一个chunk的大小,默认时128mb 。所以我们最好让
innodb_buffer_pool_size = innodb_buffer_pool_chunk_size x innodb_buffer_pool_instances的若干倍
保证每一个buffer pool实例中chunk数相同,如果innodb_buffer_pool_chunk_size x innodb_buffer_pool_instances
大于innodb_buffer_pool_size
,innodb_buffer_pool_chunk_size
会自动被调整为innodb_buffer_pool_size / innodb_buffer_pool_instances
的大小【Mysql InnoDB Buffer Pool】
经验总结扩展阅读
- 「MySQL高级篇」MySQL锁机制 && 事务
- 【MySQL】Navicat15 安装
- 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景
- 「MySQL高级篇」MySQL索引原理,设计原则
- MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。
- MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?
- llinux下mysql建库、新建用户、用户授权、修改用户密码
- RedHat7.6安装mysql8步骤
- 究极无敌细节版 Mysql索引
- Mysql通过Canal同步Elasticsearch