首页 > 数据库 >大型面试现场:一条update sql执行都经历什么?

大型面试现场:一条update sql执行都经历什么?

时间:2023-08-10 14:32:13浏览次数:71  
标签:binlog log MySQL update Server 面试 sql SQL

导读

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

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

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

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

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

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

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


1

好!我们开始吧! 



大型面试现场:一条update sql执行都经历什么?_MySQL


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


嗯,好啊!


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL


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


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


大型面试现场:一条update sql执行都经历什么?_SQL_02



大型面试现场:一条update sql执行都经历什么?_MySQL_05

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL


嗯,你继续!


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


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL


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

Server层和InnoDB层。你说说看!


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

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

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

对于MySQL来说存储引擎是可插拔的。



大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL


嗯,你说的没错

!那如果我让你写一个MySQL的Server层。

你有什么思路吗?说说看!



.....



大型面试现场:一条update sql执行都经历什么?_SQL_02


有思路

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


你知道的!MySQL被吹的再神,本质上不过是个软件而已

,而且Server层的功能相对来说比较简单,主要就是接受客户端的连接,拿到网络包中的SQL语句,然后处理......


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

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


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


大型面试现场:一条update sql执行都经历什么?_MySQL


对某个数据库中间件特别熟悉

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

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



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


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

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL


嗯,继续。


嗯嗯,那我继续往下说。

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

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

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL

那我现在就让你实现这个分析器!

task is cheap,show me the code!



,可以下看面的Case。



大型面试现场:一条update sql执行都经历什么?_SQL_19


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL



,这个话题过


你继续往下说。


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

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

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


白日梦补充:

简介undo log、truncate、以及undo log如何帮你回滚事物?


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

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL


Buffer Pool缓存池?那我得问下

这个Buffer Pool缓存池是啥?

查询缓存呀,它和BufferPool缓存池啥区别?


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

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


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

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


白日梦补充:

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


大型面试现场:一条update sql执行都经历什么?_MySQL


小伙子可以!继续说!


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

也就是:

1、先写redo log(prepare)

2、写binlog

3、写redo log (commit)

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


白日梦补充:

全网最牛X的!MySQL两阶段提交串讲!没有之一!

了解bin log的写入机制吗?说说你们线上如何调整参数的!

传说中的MySQL的redo log是什么?谈谈看


大型面试现场:一条update sql执行都经历什么?_MySQL


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


搭建集群、数据备份、数据恢复、审计的能力啊

崩溃恢复的能力。


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL


redolog的崩溃恢复的呢?

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


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

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


大型面试现场:一条update sql执行都经历什么?_MySQL_32

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

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


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


大型面试现场:一条update sql执行都经历什么?_SQL_02


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

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

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


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL


嗯!了解

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


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


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


大型面试现场:一条update sql执行都经历什么?_SQL_02


大型面试现场:一条update sql执行都经历什么?_MySQL


好好准备,期待你下一面优秀的表现

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

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

标签:binlog,log,MySQL,update,Server,面试,sql,SQL
From: https://blog.51cto.com/u_15311508/7035348

相关文章

  • 全方位对比 Postgres 和 MySQL(2023 版)
    根据2023年的StackOverflow调研(https://survey.stackoverflow.co/2023/),Postgres已经取代MySQL成为最受敬仰和渴望(themostadmired,desired)的数据库。  随着Postgres的发展势头愈发强劲,在Postgres和MySQL之间做选择变得更难了。 如果看安装数量......
  • 面试官问:Redis 分布式锁如何自动续期?
    资深面试官:你们项目中的分布式锁是怎么实现的?老任:基于redis的set命令,该命令有nx和ex选项。资深面试官:那如果锁到期了,业务还没结束,如何进行自动续期呢?老任:这个......面试官,您上个问题是啥来着?资深面试官:你们项目中分布式锁是怎么实现的。老任:我们直接使用了Redisson中提供的分布式锁......
  • PHP面试的时候,遇到拼团这个功能,可能会问到的问题,带详细答案
    如何设计数据库模型来支持拼团功能?答案:拼团功能涉及到多个用户参与同一团的情况,可以设计以下表结构:Product表:存储商品信息,包括商品ID、名称、价格等字段。Group表:存储拼团信息,包括团ID、商品ID、成团人数、拼团价格等字段。User表:存储用户信息,包括用户ID、用户名、联......
  • #yyds干货盘点# LeetCode程序员面试金典:添加与搜索单词 - 数据结构设计
    题目:请你设计一个数据结构,支持添加新单词和查找字符串是否与任何先前添加的字符串匹配。实现词典类WordDictionary:WordDictionary()初始化词典对象voidaddWord(word)将word添加到数据结构中,之后可以对它进行匹配boolsearch(word)如果数据结构中存在字符串与 word匹......
  • Microsoft SQL Server 2012 Updates / RTM (11.00.2100) / SP1 (11.0.3000.0 or 11.1.
    SQLSERVER2012SP4UpdateVersion:MSSQL2012SP4SECURITYUPDATE,Build:11.0.7507.2/11.4.7507.2,KB:KB4583465,ReleaseDate:January2021,Download:https://support.microsoft.com/en-us/topic/kb4583465-description-of-the-security-update-for-sql-serve......
  • 面试题:使用Java代码实现B系统与A系统企业信息定时同步
      java代码实现B系统与A系统企业信息的定时同步.具体要求如下:需要使用ApacheHttpComponentsClient实现接口调用;分页调用接口文档中“获取客户列表”接口接收数据,存储到customer表中;每10分钟同步一次企业信息;A系统企业出现增,删,改,B系统都能够同步;接口调用需要有重试机制......
  • 面试题:使用Java代码实现B系统与A系统企业信息定时同步
      java代码实现B系统与A系统企业信息的定时同步.具体要求如下:需要使用ApacheHttpComponentsClient实现接口调用;分页调用接口文档中“获取客户列表”接口接收数据,存储到customer表中;每10分钟同步一次企业信息;A系统企业出现增,删,改,B系统都能够同步;接口调用需要有重试机制......
  • Docker下搭建MySql主从复制
    在Docker环境下搭建MySql主从复制,阅读此文章默认读者具备基础的Docker命令操作。 一、环境1、Docker版本:Dockerversion24.0.5,buildced09962、MySql:Serverversion:5.7.36MySQLCommunityServer(GPL)3、Centos:CentOSLinuxrelease7.9.2009(Core)4、数据库Master......
  • 面试题:使用Java代码实现B系统与A系统企业信息定时同步
    ​  java代码实现B系统与A系统企业信息的定时同步.具体要求如下:需要使用ApacheHttpComponentsClient实现接口调用;分页调用接口文档中“获取客户列表”接口接收数据,存储到customer表中;每10分钟同步一次企业信息;A系统企业出现增,删,改,B系统都能够同步;接口调用需要有......
  • sudo apt update 报错:库 “https://download.docker.com/linux/ubuntu \ Release”
    sudoaptupdate报错:错误:10https://download.docker.com/linux/ubuntu\Release404NotFound[IP:143.204.126.13443]命中:11http://ppa.launchpad.net/rock-core/qt4/ubuntufocalInRelease命中:12https://dl.google.com/linux/chrome/debstableInRelease正......