首先SQL更新在词法语法解析和优化其实和查询语句是相似的,都是通过连接器连接,分析器解析,优化器优化,最后通过执行器调用Inndb存储引擎查询数据然后更新数据。而在执行操作语言时,会与查询语言不同。
如果MySQL数据库开启了缓存功能,那么,查询语句会根据表名去清空该表所有的缓存,在更新等操作语句较多的情况下,不开启缓存可能会有更高的性能。
MySQL操作日志有多种,操作语句会先操作数据,然后将操作存储到日志,包括redo log(重做日志)、undo log(提供回滚和多个行版本控制mvcc)【redo log和undo log都是inndb引擎实现的】以及binlog
整个过程如下,执行器先根据条件向存储引擎查询数据,拿到数据后进行修改,然后将数据在调用存储引擎插入行数据,然后进行如下的日志操作
redo log为物理日志,包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),该部分日志是持久的。
redo log的日志文件具有固定大小,当存储达到上限时,就会进行刷盘处理,将部分历史操作删除,然后保存新的操作,正是因为有了redo log,才能保证MySQL宕机后数据不丢失,称之为crash-safe
redo log由存储引擎生成
在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。
undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。
binlog由执行器生成
Redo log不是记录数据页“更新之后的状态”,而是记录这个页 “做了什么改动”。
Binlog有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。
内容略浅,如果需要知道各个日志具体的执行策略,可以查询第二个连接的内容,讲述的比较清晰,更加深入。
link: 02 | 日志系统:一条SQL更新语句是如何执行的? (geekbang.org)
*link: 详细分析MySQL事务日志(redo log和undo log) - 骏马金龙 - 博客园 (cnblogs.com)
link: [玩转MySQL之四]MySQL缓存机制 - 知乎 (zhihu.com)