连接器-->分析器-->优化器-->执行器
更新流程还涉及两个重要的日志模块:redo log(重做日志)、binlog(归档日志)
redo log(InnoDB 特有的日志)
WAL技术:Write-Ahead Logging,先写日志,再写磁盘。即:当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里更新内存,这个时候更新就算完成了。InnoDB引擎会在适当的时候(e.g.系统比较空闲的时候),将这个操作记录更新到磁盘里面(刷脏页)。
优点:保证即使数据库发生异常重启,之前提交的记录都不会丢失,即crash-safe。
平时执行很快的更新操作,其实就是在写内存和日志,刷脏页的过程由于会占用资源,可能会让你的更新和查询语句的响应时间长一些。MySQL偶尔“变慢”一下的那个瞬间,可能就是在刷脏页(flush)。
Q:什么时候将内存里的数据写入磁盘(flush)?
- InnoDB的redo log写满了。这时候系统会停止所有更新操作,把checkpoint往前推进,redo log留出空间可以继续写。
- 系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”(内存数据页跟磁盘数据页内容不一致),就要先将脏页写到磁盘。
- MySQL认为系统“空闲”的时候。
- MySQL正常关闭的情况。这时候,MySQL会把内存的脏页都flush到磁盘上,这样下次MySQL启