本文已参与「新人创作礼」活动,一起开启掘金创作之路
MySQL一条数据是如何保存到数据库的
从MySQL架构上来说
- 一条SQL落库需要经历三个阶段,第一是MySQL客户端,第二是MySQL服务端,第三是存储引擎
- 服务端又包含了四个部分
-
- 连接器:建立连接用来鉴权的
- 分析器:会对SQL进行词法分析还有语法分析将一条SQL语句识别成token,最后成为一个抽象语法树
- 优化器:优化器中有两种优化规则,一种是基于成本的优化,一种是基于时间的优化,默认是基于成本的优化,优化器的作用就是会对SQL做一些分析,判断它的执行代价,最后选择一种代价最小的方式来执行
- 执行器:这些都处理完了以后就交给执行器进行处理了
- 最后通过执行器将SQL发送给存储引擎查询对应的数据结构并返回
具体的执行过程✨
- 将执行语句加载到内存中,然后具体执行方式看是什么操作
-
- select:将磁盘的数据加载到内存中就行了
- update:将数据读到内存中,然后进行修改操作
- delete:将数据读到内存中,然后进行删除操作
- insert:也需要将数据读到内存中,因为要进行约束的检查,然后进行新增操作
- 这时候并不会直接写到磁盘当中,而是触发写日志操作,undolog(回滚使用)、redolog(保证数据一致性使用)、binLog(保证数据一致性使用)
- 这时候才将数据溢写入磁盘中
-
- 成功直接写即可
- 失败
-
-
- SQL执行失败通过undolog回滚数据
- 断电,通过两阶段提交保证数据的最终一致性
-
一般来说,如果主从延迟较为严重,有以下解决方案:
- 分库,将一个主库拆分为多个主库,每个主库的写并发就减少了几倍,此时主从延迟可以忽略不计。
- 打开 MySQL 支持的并行复制,多个库并行复制。如果说某个库的写入并发就是特别高,单库写并发达到了 2000/s,并行复制还是没意义。
- 重写代码,写代码的同学,要慎重,插入数据时立马查询可能查不到。
- 如果确实是存在必须先插入,立马要求就查询到,然后立马就要反过来执行一些操作,对这个查询设置直连主库。不推荐这种方法,你要是这么搞,读写分离的意义就丧失了。