前言
大家是不是感觉mysql 更新挺快的呀,有没有想过mysql 更新为什么那么快。按道理说,mysql 更新都是先找到这一行数据,然后在去更新。意味着,就有两次磁盘操作,一个是磁盘读,一个是磁盘写。如果真的是这样的话,肯定会很慢呀,mysql 也没有那么傻。
当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面 。这个过程就是flush,flush 就是把内存里的数据写入到磁盘的过程。
当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。也可以这么说,内存的数据一定是最新的。那什么时候数据会flush呢。
数据库的flush
-
redo log 已经写满了,每个更新操作,都会在 redo log 记录,这样当mysql 崩溃后,可以用redo log 恢复,这种能力就是crash-safe
-
就是系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘,这样就保证了数据页有两种状态。
1)内存里存在,内存里肯定是正确的结果,直接返回
2)另一种是内存里没有数据,就可以肯定数据文件上是正确的结果,读入内存后返回。这样的效率最高。
-
mysql 业务操作不是很繁忙的时候
-
mysql 正常关闭的时候
关于性能方面,4、3 两点都不会对mysql 性能没有什么影响。下面要着重讲解下1、2两点。 1点是redo log写满了,要flush 脏页,这种情况是要避免的,此时,整个系统就不在更新操作了,必须先刷脏页,只有redo log有空间了,才会继续更新。 第2点是内存不够用了,要先将脏页写到磁盘,这种情况是常态。InnoDB 用缓冲池(buffer pool)管理内存