日志系统:一条SQL更新语句是如何执行的

一条查询语句通常通过链接器、分析器、优化器、执行器等模块,最后到达存储引擎。
一条更新语句也须要经链接器链接数据库、分析器会经过词法和语法解析知道这是一条更新语句、优化器决定要使用的索引、而后执行器执行负责具体执行,找到这一行,而后更新。数据库

更新语句和查询语句不同的是,更新流程还涉及两个重要的日志模块,redo log(重作日志) 和 binlog (归档日志)。ide

MySQL 写 redo log 使用的是 WAL (Write-Ahead Logging)先写日志再写磁盘。优化

一条记录须要更新的时候,InnoDB 引擎会先把记录写到 redo log 里面,并更新内存,这个更新就完成了,同时,InnoDB 引擎会在适当的时候将操做记录更新到磁盘里面。这个更新每每实在系统比较空闲的时候,redo log 写满的时候也会更新到磁盘里面。日志

Innodb 的 redo log 是固定大小的,从头开始写,写到末尾就又回到开头循环写。索引

redo log 和 binlog 不一样点
1,redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,全部引擎均可以使用。
2,redo log 是窝里日志,记录的是 “在某个数据页上作了什么修改” ;binlog 是逻辑日志,记录的是这个语句的原始逻辑
3,redo log 是循环写的,空间固定会用完;binlog 是能够追加写的。事务

执行器和 InnoDB 引擎在执行简单 Update 语句时的内部流程(实例和执行流程图)内存

binlog 和 redo log 使用的是两阶段提交it

不是用两阶段提交的后果innodb

redo log 用于保证 crash-safe 能力, innodb_fiush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到硬盘,这个值设置成 1 ,能够保证 MySQL 异常重启以后数据不丢失class

sync_binlog 这个参数设置成 1 的时候,表示每次事务 binlog 都持久化到硬盘,能够保证 MySQL 异常重启以后 binlog 不丢失。

两阶段提交是跨系统维持数据逻辑一致性时经常使用的一个方案

相关文章
相关标签/搜索