概述

        在mysql开发过程中,当执行一条insert语句后,数据是如何保存到数据库的。这里将从两个角度简单的描述一下过程,希望能对大家了解mysql和面试有所帮助。

从mysql架构体系角度

      我们先看下流程图:

           

mysql select写入新表 mysql数据写入流程_mysql

  

       如上图流程所示,我们从mysql架构角度描述下sql执行过程如下:

      1.客户端发送请求到数据库的server端。
      2.mysql server端会有链接器组件接受请求。
      3.接收到请求后,会经过分析器对sql进行分析:首先进行语法分析和此法分析,如果语法有错误会返回异常,其次会生成AST抽象语法树,将语句识别成一个个的tocken。(两个开源的分析器:calcite,antlr)

      4.然后会经过优化器对sql 进行优化,生成执行性能最高的执行方式。

       5.执行器会将最终的sql调用执行引擎执行语句。

从执行细节角度

      我们从执行细节语句是如何执行的,先看下流程图如下:

            

mysql select写入新表 mysql数据写入流程_数据_02

        如上图:

        1.首先,先将执行语句加载到内存,这时候查询语句会磁盘中读取数据放到内存中,已被后继查询用。

        2. 然后DML语句会在内存中完成操作,  此时会生成,undolog,redolog,binlog三种日志文件,其中undolog使用于失败或异常时回滚用,redolog,binlog是为了保证数据一直性。

       3.内存中更新完后会将数据写会磁盘,失败场景 :如果是普通失败,会通过undoLog执行回滚,   如果是断电等场景,会通过redolog、binlog回复数据。  正常步骤:结果先写系统内存,通过执行指令fsync完成写磁盘。

redolog的两阶段提交过程  

      在执行过程中redolog有一个很重要的知识点,就是两阶段提交,在这里简单的扩展一下。

      redolog的两阶段,简单的说就是在写redolog时状态有prepare和commit两个状态,状态的变更时随着数据流程变更发生变化的。我们具体通过数据更新流程图详细看下,redolog的两阶段提交:   

                             

mysql select写入新表 mysql数据写入流程_mysql select写入新表_03

       1.执行器先从引擎中找到数据,如果内存在中有直接返回,如果没有,查询后返回。

       2.执行器拿到数据之后会先修改数据,然后调用引擎接口重新写入数据

       3.引擎将数据更新到内存,同时写数据到redolog中,此时处于prepare阶段,通知执行器可以操作。

       4.执行器生成这个操作的binglog.

      5.执行器调用引擎的事务提交接口,引擎把刚刚写完的redolog状态改成commit,执行完成。