语句执行流程
查询语句
一条查询语句的执行流程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。
更新语句
和查询语句一样。
不一样的是,更新流程还会设计到两个重要的日志模块:redo log(重做日志)和 binlog(归档日志)。
日志模块
redo log
- 是 InnoDB 引擎特有的日志。
- 固定大小
- 提升更新效率
此处省略 酒店掌柜和粉板的故事。
MySQL同理,如果每次更新操作都要写进磁盘,磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本,查找成本都很高。为了解决这个问题,MySQL的设计者就采用了类似酒店掌柜粉板的思路来提升更新效率
MySQL使用了 WAL 技术(Write-Ahead Logging),它的关键点就是先写日志,再写磁盘。也就是先写粉板,等不忙的时候再写账本。
当一条记录需要更新的时候,InnoDB引擎会先把先把记录写到 redo log 里(粉板),并更新内存,这个时候更新就算完成了。引擎会在适当的时候,将记录更新到磁盘里。往往是系统比较空闲的时候做。
redo log 是固定大小的,比如可以配置为一组4个文件,每个1G,那么这个‘粉板’总共可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写。
有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。
binlog
- 归档日志,属于 Server 层