预读导致加载到buffer pool中页的不一定会使用到
当一个sql没有合适的索引或者没用where限定条件的时候,innodb会扫描该表聚集索引所有的页 。如果页非常多,buffer pool无法容纳的时候 , 就会把其他有用的缓冲页进行淘汰,降低缓存命中率 。
全表扫描导致许多使用频率低的页被同时加载到buffer pool中 , 导致使用频率高的页从buffer pool中被移除
(这里可以看出LFU算法的好处,哈哈哈)- 热数据区:使用频率很高的缓冲页构成,称为young区
- 冷数据区:使用频率不是很高的缓存页构成 , 称为old区
文章插图
innodb_old_bolocks_pet
可以设置old区占用的比列,默认是37%3.1解决预读页面后续也许使用不到的问题innodb规定当磁盘某个页面在初次加载到buffer pool中某个缓冲页时,该缓冲页对应的控制块会放在old区域的头部,这样预读到的且后续如果不进行后续访问的页面会逐渐从old区移除,而不影响young区使用频率高的缓冲页 。
3.2解决全表扫描短时间访问大量使用频率低页面的问题在进行全表扫描时,虽然首次访问放在old区头部,但是后续会马上被访问到,这时候会把该页放在young区域的头部,这样依旧会影响到使用频率高的页面 。
为了解决这个问题,innodb规定对于某个处于old区的缓冲页第一次访问时 , 就在其控制块中记录下访问时间,如果后续访问的时间和第一次访问的时间,在某个时间访问间隔内(
innodb_old_blocks_time
可以进行设置)那么页面不会从old区移动到young区,反之移动到young区中 。这个时间间隔默认时1000ms,基本上多次访问同一个页面中的多个记录的时间不会超过1s 。3.3 优化每次都需要移动young区节点到LRU链表头部的问题如果每次访问一个缓冲页都需要移动到LRU链表的头部,像young区中这种热点数据 , 每次都需要更新链表头部,并且这还是一个高并发操作,需要CAS或者锁,开销也不小 。为了解决这个问题 innodb规定只有被访问的缓冲页位于young区的前1/4范围外,才会进行移动,所以前1/4的高热度的数据,不会频繁移动
六丶脏页刷盘innodb后台有专门的线程负责将脏页刷新到磁盘
- 从LRU链表中的冷数据刷新一部分页面到磁盘
后台线程定时从LRU链表尾部扫描一些页面,扫描的页面数量可以通过innodb_lru_scan_depth
指定,如果在LRU中发现脏页,那么刷新到磁盘
- 从flush链表刷新一部分页面到磁盘
后台线程也会定时从flush链表中刷新一部分页面到磁盘,刷新速率取决于系统是否繁忙
这里我们可以看到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数相同,如果
推荐阅读
- 「MySQL高级篇」MySQL锁机制 && 事务
- 【MySQL】Navicat15 安装
- 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景
- 「MySQL高级篇」MySQL索引原理,设计原则
- MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。
- MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?
- llinux下mysql建库、新建用户、用户授权、修改用户密码
- RedHat7.6安装mysql8步骤
- 究极无敌细节版 Mysql索引
- Mysql通过Canal同步Elasticsearch