概述
在mysql开发过程中,当执行一条insert语句后,数据是如何保存到数据库的。这里将从两个角度简单的描述一下过程,希望能对大家了解mysql和面试有所帮助。
从mysql架构体系角度
我们先看下流程图:
如上图流程所示,我们从mysql架构角度描述下sql执行过程如下:
1.客户端发送请求到数据库的server端。
2.mysql server端会有链接器组件接受请求。
3.接收到请求后,会经过分析器对sql进行分析:首先进行语法分析和此法分析,如果语法有错误会返回异常,其次会生成AST抽象语法树,将语句识别成一个个的tocken。(两个开源的分析器:calcite,antlr)
4.然后会经过优化器对sql 进行优化,生成执行性能最高的执行方式。
5.执行器会将最终的sql调用执行引擎执行语句。
从执行细节角度
我们从执行细节语句是如何执行的,先看下流程图如下:
如上图:
1.首先,先将执行语句加载到内存,这时候查询语句会磁盘中读取数据放到内存中,已被后继查询用。
2. 然后DML语句会在内存中完成操作, 此时会生成,undolog,redolog,binlog三种日志文件,其中undolog使用于失败或异常时回滚用,redolog,binlog是为了保证数据一直性。
3.内存中更新完后会将数据写会磁盘,失败场景 :如果是普通失败,会通过undoLog执行回滚, 如果是断电等场景,会通过redolog、binlog回复数据。 正常步骤:结果先写系统内存,通过执行指令fsync完成写磁盘。
redolog的两阶段提交过程
在执行过程中redolog有一个很重要的知识点,就是两阶段提交,在这里简单的扩展一下。
redolog的两阶段,简单的说就是在写redolog时状态有prepare和commit两个状态,状态的变更时随着数据流程变更发生变化的。我们具体通过数据更新流程图详细看下,redolog的两阶段提交:
1.执行器先从引擎中找到数据,如果内存在中有直接返回,如果没有,查询后返回。
2.执行器拿到数据之后会先修改数据,然后调用引擎接口重新写入数据
3.引擎将数据更新到内存,同时写数据到redolog中,此时处于prepare阶段,通知执行器可以操作。
4.执行器生成这个操作的binglog.
5.执行器调用引擎的事务提交接口,引擎把刚刚写完的redolog状态改成commit,执行完成。