导读

Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇。

今天我要跟你分享的MySQL话题是:“从一条update sql执行都经历什么开始,发散开一系列的问题,看看你能抗到第几问吧”

换一种写作风格,自导自演面试现场!感觉这样还是比较有趣的,欢迎大家订阅我的MySQL专题,公众号首发!持续更新中~

点击阅读原文,格式会好看一点哦~

点击阅读原文,格式会好看一点哦~

点击阅读原文,格式会好看一点哦~

欢迎关注白日梦,公众号首发!持续连载中

1
好!我们开始吧! 


























                              























Hi同学,听说你上一面表现的还可以,这一面要不咱继续?



嗯,好啊!









好,你说一下一条update sql的执行,都经历了哪些阶段吧



我可以画一张简图,然后我们一起看一下这张脑图吧






你可以花几秒看下这个图哦









嗯,你继续!



一般在我们的后端系统中,和数据库打交道都逻辑都放在DAO层,DAO层的持久化框架中封装了:数据驱动(Driver),SQL语句一般也都是由DAO层的持久化框架发送给数据库的。









嗯,那你说的DAO层就是上图中的客户端了吧

但是我看你的简图,貌似是把数据库划分成两部分,Server层和InnoDB层。你说说看!



是的,通常大家会把数据库分层两部分,上层的Server层和下层的存储引擎层。

总的来看:Server层主要是负责和客户端建立网络连接,接受客户端传递过来的SQL、预处理、由执行器发送给储存引擎执行。

而存储引擎会和操作系统的文件系统打交道。

我在图中画的存储引擎层是InnoDB,MySQL不止这一种执行引擎,对于MySQL来说存储引擎是可插拔的。

常见的还有什么MyISAM、NDB、Memory等等。









嗯,你说的没错!那如果我让你写一个MySQL的Server层。你有什么思路吗?说说看!



.....






有思路,下面我用大白话简单描述一下:

你知道的!MySQL被吹的再神,本质上不过是个软件而已,而且Server层的功能相对来说比较简单,主要就是接受客户端的连接,拿到网络包中的SQL语句,然后处理......

并且它是单进程多线程的软件,通常会占用3306端口启动,那我完全可以一比一写出一个MySQL Server层嘛!

比如我可以用熟悉的编程语言,TCP编程,写个TCP - Server端,监听3306端口启动。然后从接收到的数据包中取出数据,按照MySQL协议解析数据,得到SQL语句。再处理SQL语句就是了!






白日梦补充:欢迎关注我的公众号,我特希望出一套视频课,从0开始,手撸出一个数据库中间件(有读写分离、权限管理、事务能力)。让每个加入白日梦的圈子的人都吃透数据库中间件!





嗯!(我猜这家伙肯定对某个数据库中间件特别熟悉

你整体的思路是没问题的!

回到正题,继续说update sql如何被处理。



,我们的应用程序把SQL发送给Server层后,SQL会陆续被分析器、优化器、执行器处理。

另外在图中你能看到:查询缓存。这个查询缓存由Server层维护,它设计的初衷就是在内存中暂存原来查询的结果。以便下次查询时可以快速得到结果^_^

但是它有个缺点就是当有对该表的更新操作时,该表的查询缓存会被废弃。所以MySQL8中将查询缓存砍掉了。









嗯,继续。



嗯嗯,那我继续往下说。

分析器的作用:对SQL进行语法、词法上的分析。

优化器的作用:生成执行计划、选择索引。

执行器的作用:操作执行引擎,获取SQL的执行结果。









嗯,刚才你还说你可以写个MySQL的Server层,那我现在就让你实现这个分析器!

task is cheap,show me the code!



,可以下看面的Case。









,这个话题过

你继续往下说。



我们的update sql经过server层的分析检测之后,最终由执行器交由存储引擎执行。

因为InnoDB是支持事务的,而我们现在是update类型的SQL,所以会被放在一个单独的事务中去执行。

为了提供事务回滚的能力,于是有了上图中的第5步,InnoDB存储引擎会先写undo log。






白日梦补充:
简介undo log、truncate、以及undo log如何帮你回滚事物?


写完undo log之后,整体的执行流程会来到图中的第6步。

在BufferPool缓存池中对内存中的数据进行update。









Buffer Pool缓存池?那我得问下

这个Buffer Pool缓存池是啥?

另外我看你上图中的Server层也有一个查询缓存呀,它和BufferPool缓存池啥区别?



嗯,是这样的。 首先我们都知道,MySQL是支持持久化的,数据最终都落在磁盘上。

但是如果所有的update sql 都直接、大量、频繁的进行IO磁盘操作,会导致MySQL整体的性能极具下降。






现在MySQL实现方式是:它在内存中对数据进行CRUD,所以在图中可以看到,BufferPool中的数据是从磁盘上读进去的。

在内存中CRUD就能获得最大的性能。后续再通过一定的机制将数据刷新回磁盘中。






白日梦补充:
用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!





小伙子可以!继续说!



当update sql修改完内存中的数据后,接下来就是提交事务了。提交事务的方式一般都是两阶段提交。

也就是:

1、先写redo log(prepare)

2、写binlog

3、写redo log (commit)

这些日志后续也都会有一定的机制控制把它们持久化到磁盘中。






白日梦补充:
全网最牛X的!MySQL两阶段提交串讲!没有之一!
了解bin log的写入机制吗?说说你们线上如何调整参数的!
传说中的MySQL的redo log是什么?谈谈看





那你说一下redo log、bin log分别给了MySQL什么能力吧



记录binlog可以使MySQL就拥有:搭建集群、数据备份、数据恢复、审计的能力啊

写redolog后MySQL就拥有了崩溃恢复的能力。









嗯,那你是怎么理解这个binlog的数据恢复和redolog的崩溃恢复的呢?

binlog 有redolog 崩溃恢复的能力嘛?



嗯~,我是这样理解的:binlog由MySQL的上层也就是Server层记录。

可以看下这张图:截自部分binlog

可以看到binlog中记录的是sql语句,记录这你对哪张表的id=xx的行做了什么样的修改。

像数据表啊、行啊这都是一些只存在于逻辑上概念。






而redolog中记录的是物理层面的概念。比如redo log中会记录你对xxx表空间的XXX数据页xxx偏移量的地方做了XXX更新。






所以说,binlog的数据恢复和redo log的崩溃恢复其实是发生在两个层面的,完全是两码事的!

就像是上图那样,binlog的中不是记录着SQL吗?所以可以把借助binlog的实现的数据恢复理解成回放binlog中的SQL。

而redolog的崩溃恢复指的是当MySQL出现异常Crash重启后,将内存中数据恢复成崩溃前的脏数据







嗯!了解,整体上看你的回答的还可以!

我没有问题了,你还有什么想问我的吗?

没有问题了,感谢大佬百忙抽空来给我面试!







哈哈,客气!你应该会进入下一面的。好好准备,期待你下一面优秀的表现

推荐阅读

  1. MySQL的修仙之路,图文谈谈如何学MySQL、如何进阶!(已发布)
  2. 面前突击!33道数据库高频面试题,你值得拥有!(已发布)
  3. 大家常说的基数是什么?(已发布)
  4. 讲讲什么是慢查!如何监控?如何排查?(已发布)
  5. 对NotNull字段插入Null值有啥现象?(已发布)
  6. 能谈谈 date、datetime、time、timestamp、year的区别吗?(已发布)
  7. 了解数据库的查询缓存和BufferPool吗?谈谈看!(已发布)
  8. 你知道数据库缓冲池中的LRU-List吗?(已发布)
  9. 谈谈数据库缓冲池中的Free-List?(已发布)
  10. 谈谈数据库缓冲池中的Flush-List?(已发布)
  11. 了解脏页刷回磁盘的时机吗?(已发布)
  12. 用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(已发布)
  13. 听说过表空间没?什么是表空间?什么是数据表?(已发布)
  14. 谈谈MySQL的:数据区、数据段、数据页、数据页究竟长什么样?了解数据页分裂吗?谈谈看!(已发布)
  15. 谈谈MySQL的行记录是什么?长啥样?(已发布)
  16. 了解MySQL的行溢出机制吗?(已发布)
  17. 说说fsync这个系统调用吧! (已发布)
  18. 简述undo log、truncate、以及undo log如何帮你回滚事物! (已发布)
  19. 我劝!这位年轻人不讲MVCC,耗子尾汁! (已发布)
  20. MySQL的崩溃恢复到底是怎么回事? (已发布)
  21. MySQL的binlog有啥用?谁写的?在哪里?怎么配置 (已发布)
  22. MySQL的bin log的写入机制 (已发布)
  23. 删库后!除了跑路还能干什么?(已发布)
  24. 自导自演的面试现场,趣学数据库的10种文件(已发布)

最后,欢迎关注白日梦的公号哦~

换一种写作风格,自导自演面试现场!感觉这样还是比较有趣的,欢迎大家订阅我的MySQL专题,公众号首发!持续更新中~

点击阅读原文,格式会好看一点哦~

点击阅读原文,格式会好看一点哦~

点击阅读原文,格式会好看一点哦~

大型面试现场:一条update sql执行都经历什么?的更多相关文章

  1. 一条update SQL语句是如何执行的

    一条更新语句的执行过程和查询语句类似,更新的流程涉及两个日志:redo log(重做日志)和binlog(归档日志).比如我们要将ID(主键)=2这一行的值加(c:字段)1,SQL语句如下: upda ...

  2. springboot+Mybatis+MySql 一个update标签中执行多条update sql语句

    Mysql是不支持这种骚操作的,但是不代表并不能实现,只需要在jdbc配置文件中稍微做一下修改就行. driver=com.mysql.jdbc.Driver url=jdbc:mysql://127 ...

  3. 面试现场:说说char 和 varchar的区别你了解多少?

    Hi,大家好!我是白日梦!本文是MySQL专题的第 26 篇. 下文还是白日梦以自导自演的方式,围绕"说说char 和 varchar的区别你了解多少?"展开本话题.看看你能抗到第 ...

  4. 面试官:说说一条查询sql的执行流程和底层原理?

    一条查询SQL执行流程图如下 序章 自我介绍 我是一条sql,就是一条长长的字符串,不要问我长什么样,因为我比较傲娇. 额~~不是我不说啊,因为细说起来,我可以细分为DML(Update.Insert ...

  5. 一条查询sql的执行流程和底层原理

    1.一条查询SQL执行流程图 2.查询SQL执行流程之发送SQL请求 (1)客户端按照Mysql通信协议将SQL发送到服务端,SQL到达服务端后,服务端会单起一个线程执行SQL. (2)执行时Mysq ...

  6. 腾讯面试:一条SQL语句执行得很慢的原因有哪些?---不看后悔系列

    说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 之前腾讯 ...

  7. 一条简单的 SQL 执行超过1000ms,纳尼?

    作者:VipAugus https://juejin.im/post/5ce906a3e51d455a2f2201dc MySQL对我说"Too young, too naive!" ...

  8. JAVA中处理事务的程序--多条更新SQL语句的执行(包括回滚)

    在与数据库操作时,如果执行多条更新的SQL语句(如:update或insert语句),在执行第一条后如果出现异常或电脑断电, 则后面的SQL语句执行不了,这时候设定我们自己提交SQL语句,不让JDBC ...

  9. 一条简单的 SQL 执行超过 1000ms,纳尼?

    阅读本文大概需要 2.8 分钟. MySQL 对我说 “Too young, too naive!" ▌大概过程 在测试环境 Docker 容器中,在跨进程调用服务的时候,A 应用通过 Du ...

随机推荐

  1. gcc/g++命令参数

    在windows环境下,我们运行一程序,只需要在VS中点击运行按键即可,VS帮我们做完了程序的预处理.编译.汇编.链接阶段 但是在linux环境下,我们只能借助gcc/g++完成这一系列的操作 -o参 ...

  2. 腾讯IOT安卓开发初探

    目录 腾讯IOT 安卓开发初探 Tecent IOT 开发平台的使用 新建项目 创建产品 添加自定义功能 设备开发 微信小程序配置 面板配置 新建设备 使用设备 安卓开发 前置配置 data.json ...

  3. .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ HelloWorld)--学习笔记

    2.6.3 RabbitMQ -- HelloWorld 发送端 接收端 rabbitmq container 发送信息 https://www.rabbitmq.com/tutorials/tuto ...

  4. 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..

    1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...

  5. 对Java集合的概述

    前言 大部分编程语言都提供了数组来保存对象,数组是非常重要的数据结构之一.但是数组在初始化时就已经定义了数组长度,不可变,使用起来颇为麻烦.因此,Java 在 JDK 1.2 版本中添加了集合框架,用 ...

  6. db_install.rsp dbca.rsp netca.rsp 详解【转】

    db_install.rsp详解 #################################################################### ## Copyright(c ...

  7. 解锁Renderbus客户端使用新技巧----快速渲染效果图篇

    度娘说,效果图最基本的要求就是:应该符合事物的本身尺寸,不能为了美观而使用效果把相关模型的尺寸变动,那样的效果图不但不能起到表现设计的作用,反而成为影响设计的一个因素.可见高效渲染效果图是都是当下我们 ...

  8. Sentry(v20.12.1) K8S 云原生架构探索,SENTRY FOR JAVASCRIPT Source Maps 详解

    系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...

  9. leetcode1637-两点之间不包括任何点的最宽垂直面积

    题目 给你 n 个二维平面上的点 points ,其中 points[i] = [xi, yi] ,请你返回两点之间内部不包含任何点的 最宽垂直面积 的宽度. 垂直面积 的定义是固定宽度,而 y 轴上 ...

  10. 面试官:Netty的线程模型可不只是主从多Reactor这么简单

    笔者看来Netty的内核主要包括如下图三个部分: 其各个核心模块主要的职责如下: 内存管理 主要提高高效的内存管理,包含内存分配,内存回收. 网通通道 复制网络通信,例如实现对NIO.OIO等底层JA ...