mysql一条数据如何保存到数据库的?

概述

        在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,执行完成。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

密度比例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值