• 使用后,变成脏页
  • 数据页从磁盘读入内存时,需要 向buffer_pool申请一个数据页 ,buffer_pool会根据 LRU算法 淘汰一个数据页,如果淘汰的数据页是脏页,那么会先将脏页数据刷新到磁盘中,然后才复用数据页;如果一个查询要 淘汰掉的脏页太多了,会导致查询的响应时间变长

  • InnoDB从磁盘中加载数据的时候,是以数据页作为单位的, 默认数据页大小为16K ,通过参数 innodb_page_size 可以设置数据页的大小(从MySQL5.6开始可以通过这个参数调整,但是5.6以前,需要修改源码中的UNIV_PAGE_SIZE相关值)
  • buffer_pool中的LRU算法是改进后的URL算法,目的是为了InnoDB加载冷数据的同时,可以 保持buffer_pool的内存命中率
  • buffer_pool是InnnoDB的缓冲池,里面包含了各种buffer,例如change_buffer、join_buffer等等
  • 设置脏页刷新策略

  • 想要InnoDB以合理的速度去刷新脏页,首先需要先告诉InnoDB,所在主机的磁盘IO能力,然后通过设置 innodb_io_capacity参数 ,指定InnoDB刷新脏页的速度上限
  • InnDB根据两个因素来判断刷新脏页的速度
  • buffer_pool中的脏页比例 innodb_buffer_pool_pages_dirty/innodb_buffer_pool_pages_total
  • redo log中的剩余空间
  • 邻居连坐机制

    刷脏页的额时候,如果发现脏页旁边的数据页(邻居)也是脏页,就会将这个邻居也一并刷掉,以此类推

    通过参数 innodb_flush_neighbors 控制该机制

  • innodb_flush_neighbors = 1表示启用
  • innodb_flush_neighbors = 0表示禁用
  • 连坐机制对于机械硬盘是很有意义的,机械硬盘IOPS比较低,通过连坐机制可以 减少大量随机IO

    对于SSD设备,建议设置innodb_flush_neighbors = 0,因为SSD的IOPS很高

    服务端开发(Golang) @ 金山办公 42.8k
    粉丝