一、基本流程
更新sql和查询sql相似,都要经过mysql的server层和存储引擎层。这里我们先复习一下mysql的整体架构:
1.连接器:首先客户端与mysql建立连接,经过tcp连接后验证用户的身份。
2.cache:先去缓存里查询是否有满足条件的缓存,缓存通常是以key-value键值对的形式存储的。
3.分析器:进行词法分析和语法分析,如果sql的格式出粗,那么会在此时报错。
4.优化器:确定选取的索引和表之间的连接顺序,生成执行计划。
5.执行器:调用对应的存储引擎的接口完成相关操作。
二、日志模块
在mysql中,并不是我们每update一次,就会向磁盘中写入数据,如果这样,那么每次更新的查找成本和IO成本都很高。
这就好比古代生活中,饭馆老板有一个记账本,用来记录赊账情况,那么当某一天饭馆很忙的时候,如果有人来还钱,那么如果此时老板去记账本中翻找该人的赊账记录的话,后续就会有很多客人进行排队了,所以此时老板可以先把还账人的名字记录在一个板子上,这样等饭馆打样以后自己私下再去对账。
对应到mysql中,记账本就是我们的磁盘,板子就是内存。mysql中常说的WAL(Write Aheah Logging)就是根据这种思想来的,关键点就是先写日志,再写磁盘。
redolog | binlog | |
环境 | innodb | mysql(server) |
日志类型 | 物理日志 | 逻辑日志 |
写方式 | 循环写(大小固定) | 追加写 |
三、更新语句执行流程
update T set c=c+1 where ID=2;
两阶段提交
反证法,如果不用两阶段提交,那么无论先写redolog还是binlog,只要中间mysql发生崩溃,那么都会导致数据不一致。