我们在日常使用sql中,查询数据库反映的时间过长,这时候可能是flush脏页导致的,而脏页会什么时候触发呢?
当查询的数量太多,每次全量查询都会淘汰掉脏页从而触发磁盘的I/O操作户导致查询时间过长。
当innoDB的redo log满了后,这时候会占用内存优先刷新redo日志,执行flush吧数据刷到磁盘,腾出redo log空间。
系统内存不足时候,需要淘汰脏页给新的页使用。
当mysql系统认为空闲的时候,会刷新脏页到磁盘。
当mysql服务器正常关闭,会刷新脏页到磁盘。
脏页和干净页都是在内存里的,当磁盘上的数据与buffer pool里的数据不一致,这时候就是脏页。当内存里的数据写到磁盘后,内存和磁盘里的内容数据保持一致,则称为干净页。
Buffer pool的作用是干嘛的,是为了减少磁盘的I/O,innoDB不可能每次存入一条数据都对磁盘访问一次,因为磁盘的i/o相对于内存是非常慢的,所以在mysql服务器启动的时候,会申请个内存作用于buffer pool。(innoDB-buffer-pool-size)
因为有脏页和干净页的存在,所以有了free 链表 和 flush链表,以及lru链表,每次有新数据查询,总不能每次查找干净页,与是干净页同意放在free链表,修改数据的脏页统一放在flush链表。而每次不可能吧所有页都刷新到磁盘,为了减少磁盘刷新的频率,所以选一部分淘汰,这时候lru链表就出现了,这里面有热数据和冷数据,比例是3:7,因为innoDB查询会自动预读,来提高查询效率,这时候为了解决预读问题,第一次查询的数据会放入冷数据,如果在一个临界点,超过innoDB_block_time设置的时间,再查一次,则会放入热数据,冷数据的地方就会慢慢淘汰。