要说清楚SQL更新语句是怎样执行的, 我们用一条最简单的SQL语句来做下示例:
update user set age = age + 1 where id = 3;
其实更新语句的执行和查询语句的执行流程相似,但是更复杂一些.首先,也是通过连接器进行连接,然后将user表的查询缓存都失效,接下来,分析器会通过词法和语法分析知道这是一条更新语句,优化器来选择id这个索引,然后执行器负责找到这一行,并更新,这个过程非常复杂,要说清这个过程,我们首先要理解什么是
redo log(重做日志)和binlog(归档日志).
redo log 日志模块:
redo log是InnoDB引擎特有的日志,在写库的时候,如果每次我们都是在磁盘上找到对应的位置,然后去操作,那么整个过程的IO成本,查找成本都很高,为了解决这个问题,InnoDB引擎添加了一个Write-Ahead Logging的操作(简称WAL),它的关键点是先写日志,等空闲的时候再写磁盘.具体来说,就是当有一条记录需要更新的时候,InnoDB引擎会把记录写到redo log里面,并更新内存,InnoDB引擎会在空闲的时候,将这个操作记录更新到磁盘里面,如果写库操作特别多的话,redo log有写满的风险,这个时候InnoDB引擎就会先把一部分redo log写入到磁盘,腾出空间来.有了redo log,InnoDB就可以保证数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe.
binlog 日志模块:
binlog日志是Server层日志,所有存储引擎都可以使用,binlog日志记录的是执行的sql语句,而redo log是物理日志,记录的是在磁盘的某个位置为了什么修改;再有就是binlog日志可以追加写,一个文件写满了就切换到下一个文件,而redo log日志有固定的空间,如果快用完了,那么InnoDB引擎就会先把一部分redo log写入到磁盘,腾出空间来.
接着看执行器和InnoDB引擎执行简单的upda
SQL更新语句是怎样执行的(redo log日志和binlog日志)
最新推荐文章于 2024-07-29 15:41:55 发布
本文以一个简单的SQL更新语句为例,详细解析其执行流程,涉及连接器、分析器、优化器和执行器的作用。重点介绍了InnoDB引擎的redo log(重做日志)和binlog(归档日志),解释了它们在数据库崩溃恢复和主从同步中的作用,以及两阶段提交确保日志一致性的重要性。
摘要由CSDN通过智能技术生成