数据库常见校招面试(一)

本文详细介绍了MySQL的三层架构,包括连接器、分析器、优化器和执行器的功能。同时,阐述了一条SQL在数据库中的执行过程,涉及连接池、分析、优化和执行。此外,讨论了数据库的三大范式以及CHAR和VARCHAR的区别。
摘要由CSDN通过智能技术生成

        文章中的题目来自于:https://www.iamshuaidi.com/1402.html。如下仅是作者个人的总结回答,希望能为你带来帮助和启发。

        笔者不过是一个双非研究生,科研之外做点感兴趣的事情。请相信学习成长的路上并不孤单,如果有任何疑问欢迎私信~~~~

 

内容总览

1:谈谈Mysql架构

            

分三层来理解

    

    关于mysql的架构大体可以分为如图所示的三层信息,其中服务层个设备的功能如下:

            连接器:主要管理连接请求信息

            分析器:对待执行sql语句进行词语、语法的分析

            优化器:优化sql的执行顺序,提升查询效率

            执行器:最终执行sql语句,获取结果集信息

    存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。mysql架构下采取了插件式的设计方法支持 InnoDB、MyISAM、Memory 等多个存储引擎。

2:一条sql如何在数据库中执行流程

        这个问题其实有一篇博客曾专门分析过,文末会给出博客地址连接。笔者的回答不求精确,但求无误。对你能有所启发。

      连接池可能时我们从事开发过程中经常接触到的,通俗来看:数据库连接池维护一定的连接数,方便系统获取连接,使用就去池子中获取,用完放回去就可以了。我们不需要关心连接的创建与销毁,也不需要关心线程池是怎么去维护这些连接的。这其实就是连接器帮我做的事情,主要负责客户端连接建立,权限管理,连接维持等任务。

    数据库通过网络连接的方式进行连接的建立,而网络连接则需要交给线程来操作,当需要执行的sql语句执发送至mysql数据库后,会从连接管理器中选取一个空先线程进而处理该sql任务。

   MySQL 中处理请求的线程在获取到请求以后获取 SQL 语句去交给 SQL 接口去处理,如下 这句sql我们在熟悉不过了,就是查询学生列表中全体的用户信息。

      SELECT stuName,age,sex FROM students     

    我们对于该sql的语义很清楚,但计算器并不清楚 我们具体要执行的操作任务,所以此时需要服务层的解析器来完成对该sql语法和词法的分析解释,使得计算机可以明白其背后的语义。

    但当 SQL 已经被解析成  MySQL  认识的样子的,那下一步是不是就是执行吗?理论上是这样子的,但是 MySQL 的强大远不止于此,他还会帮我们选择最优的查询路径。

    此时,查询优化器会帮我去使用他自己认为的最好的方式去优化这条  SQL  语句,并生成一条条的执行计划,比如你创建了多个索引,MySQL 会依据成本最小原则来选择使用对应的索引,进而减少IO操作和CPU运行成本。

    当经历过优化器优化后,最终会去调用存储引擎接口,开始去执行被  MySQL  解析过和优化过的 SQL 语句。

    执行器是一个非常重要的组件,因为前面那些组件的操作最终必须通过执行器去调用存储引擎接口才能被执行。执行器最终最根据一系列的执行计划去调用存储引擎的接口去完成  SQL  的执行。

    至此 sql也算执行完毕,其实后续还会有 日志信息的记录,如果对这部分感兴趣可以参看原文链接,后续我也会将自己的认识进行总结归纳。

    

执行图示

3.数据库三大范式是什么 

    1NF:数据表的列信息必须原子不可分

    2NF:保证非主码信息对主码信息的完全依赖,而不能只与主键的某一部分相关

   2NF其实主要针对联合主键而言,比如数列信息有:订单号、产品号、产品数量、产品折扣、产品价格、订单金额,订单时间等信息。

    我们错误的选取了 订单号,产品号作为了主键信息

    不难发现,产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关,

    这样就不满足第二范式的要求。此时就需要对表信息进行拆分处理。

3NF:消除数据间的传递依赖

 

    上表中,所有属性都完全依赖于学号,所以满足第二范式,但是“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”,完成可以通过学号信息确定班主任后,在确定其性别信息 。这就导致了传递依赖的发生。进而导致班主任性别信息不依赖于主键“学号”,所以需做如下调整:

原始不满足3nf的 数据表信息

  

修改后的数据表信息

4:char和varchar的区别

    ​char和varchar其实都是mysql中的数据类型,皆在为了存放字符型数据。不同点在于varchar用于存储变长字符串,仅占用必要的存储空间。而char则是定长信息存储,最大宽度可达 255。

    ​在varchar(N)中,N表示的是字符数 ,而非字节数(通常来看一个字符可能会占用多个字节信息,比如如果采用UTF-8编码,则一个字符会占用三个字节信息),如果有参阅过官方手册不难发现,则官方定义中varchar类型最大支持65535,但我们执行如下sql时,会有这样的提示:

错误提示

    ​不难发现如果我们创建列长度信息为65535的列会出错,此时我们就可以知道官方手册中指出的65535其实说的字节,而非字符长度信息。

    ​此时我们来回顾下char/varchar的回答思路首先指出char和varchar的区别信息,之后顺带谈一谈对于varchar在存储长度方面的限制。

    ​  其实对于char和vachar存放 时还会有一个行溢现象的发生,感兴趣的可以自行了解,在此就 不敢高谈阔论了

 

参考链接:

     校招面试:https://www.iamshuaidi.com/1402.html

      一条sql执行流程:https://mp.weixin.qq.com/s/J_ng048H4eHBm_4VBjFiWw

 

 

 

关于我:

        毅航同学。一名山大的普通计算机研究生,业余读读书,总结技术学习上的感悟。希能帮助到你。欢迎你同我一起进步,一起交流。

 

     文章内容皆是个人学习过后自己的一些观点看法,希望能给你带来帮助,而不是淡出的去应对面试。追求卓越,机会自会向你而来。

       

      个人联系方式:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值