MySQL一条数据是如何保存到数据库的

139 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

MySQL一条数据是如何保存到数据库的

从MySQL架构上来说

  1. 一条SQL落库需要经历三个阶段,第一是MySQL客户端,第二是MySQL服务端,第三是存储引擎
  2. 服务端又包含了四个部分
    1. 连接器:建立连接用来鉴权的
    2. 分析器:会对SQL进行词法分析还有语法分析将一条SQL语句识别成token,最后成为一个抽象语法树
    3. 优化器:优化器中有两种优化规则,一种是基于成本的优化,一种是基于时间的优化,默认是基于成本的优化,优化器的作用就是会对SQL做一些分析,判断它的执行代价,最后选择一种代价最小的方式来执行
    4. 执行器:这些都处理完了以后就交给执行器进行处理了
  1. 最后通过执行器将SQL发送给存储引擎查询对应的数据结构并返回

具体的执行过程✨

  1. 将执行语句加载到内存中,然后具体执行方式看是什么操作
    1. select:将磁盘的数据加载到内存中就行了
    2. update:将数据读到内存中,然后进行修改操作
    3. delete:将数据读到内存中,然后进行删除操作
    4. insert:也需要将数据读到内存中,因为要进行约束的检查,然后进行新增操作
  1. 这时候并不会直接写到磁盘当中,而是触发写日志操作,undolog(回滚使用)、redolog(保证数据一致性使用)、binLog(保证数据一致性使用)
  2. 这时候才将数据溢写入磁盘中
    1. 成功直接写即可
    2. 失败
      1. SQL执行失败通过undolog回滚数据
      2. 断电,通过两阶段提交保证数据的最终一致性

一般来说,如果主从延迟较为严重,有以下解决方案:

  • 分库,将一个主库拆分为多个主库,每个主库的写并发就减少了几倍,此时主从延迟可以忽略不计。
  • 打开 MySQL 支持的并行复制,多个库并行复制。如果说某个库的写入并发就是特别高,单库写并发达到了 2000/s,并行复制还是没意义。
  • 重写代码,写代码的同学,要慎重,插入数据时立马查询可能查不到。
  • 如果确实是存在必须先插入,立马要求就查询到,然后立马就要反过来执行一些操作,对这个查询设置直连主库不推荐这种方法,你要是这么搞,读写分离的意义就丧失了。