首页|资源下载
登录|注册

您现在的位置是:首页 > 技术阅读 >  我当面试官,面你 MySQL 基础

我当面试官,面你 MySQL 基础

时间:2023-12-31


许久不见的【面试官来袭】系列终于又和大家见面啦!

很多人问我,面试到底考察什么?面试官究竟想听到怎样的回答?针对这类疑惑,我觉得最好的解答,无疑是带着大家,以面试官视角,去进行面试,知己知彼,百战不殆,这就是这个系列的初衷。
针对MySQL,一般要考察的知识点都在下图,根据候选人的情况,会选择不同的知识点进行提问。


通过上图,大家对MySQL面试问题也心里有数了吧?
由于有小伙伴反应第一弹Redis系列内容过长,消化不过来。所以我从本次开始,每个技术专题,都会由浅至深,分篇进行讲解,知识点也会更加全面。
话不多说,接下来就来看看我们面试官系列的第二弹——MySQL基础篇
今天的面试者依旧是阿柴,经过上次Redis的洗礼,面对恶魔面试官,相信阿柴也更游刃有余了。
现在,就让我们开启这场沉浸式面试吧。


基本概念


你能谈谈MySQL是什么吗?

MySQL是一个传统的RDBM数据库,也就是关系型数据库,广泛应用于OLTP场景。



你提到了OLTP,能说说它和OLAP的区别是什么吗?

OLTP(联机事务处理)是传统的关系型数据库的主要应用,用于基本的、日常的事务处理,例如银行的交易记录;


OLAP(联机分析处理)是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供了直观易懂的查询结果。最常见的应用就是复杂的动态报表系统。


总体来说,OLTP用于日常处理、OLAP用于数据分析。





你知道数据库的三范式分别是什么吗?

第一范式:字段不可分。强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项;


第二范式:有主键,非主键字段依赖主键。要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性;


第三范式:非主键字段不能相互依赖,任何非主属性不依赖于其它非主属性。



基础定义类的问题一般问校招生比较多,考察一下理论知识。在实际应用中,只是个参考,某些场景,甚至可以反范式。

DML是什么呢?

DML是数据操作语言,用于检索或者修改数据。我们平常最常用的增删查改就是DML。



DDL又是什么?

DDL是数据定义语言,用于操作数据结构,比如创建表,删除表,更改索引等都是DDL。



那DCL呢?

DCL是数据控制语言,用于定义数据库用户的权限,比如创建用户,授权用户,删除用户等都是DCL。



以上三个问题,是针对数据库操作分类的考察。很多同学只知道增删查改,并不知道它们属于哪类。
这些抽象概念都是重要的数据库基础知识,由于学生大多缺乏经验,面试官不会偏向于实战型或技术型的问题,所以这类概念型知识点往往是校招考察的重点方向。




数据结构与常见操作


能说说varchar与char的区别是什么吗?

char是一种固定长度的类型,varchar则是一种可变长度的类型。比如char(128)和varchar(128),前者无论字符串长短,在磁盘上,都会占据固定的128字符大小。后者是可变长度,不过它最大也不能超过128。



既然varchar是变长,那是不是设置varchar(1000)一定比varchar(100)好?


嗯...不是这样的。虽然varchar是变长,在相同长度下,磁盘空间占用一样,将值设置更大一些,弹性空间也更大。但也不是完全没有代价的...


在内存加载的时候,每次都是按最大空间来分配的。显然,在排序场景,或者一些临时表聚合场景,更大空间会产生明显的不利影响。



varchar中的长度不光影响磁盘空间,还会影响在使用时的内存空间,并不是越长越好,这也是个常见且易踩坑的考点。



varchar是变长,char是定长,那能用varchar完全代替char么?

不能。varchar的优点是更灵活。但是char也不是一无是处的。

首先,varchar会额外用一个字节存储长度信息,而char则节约了一个字节;


其次,char的存储空间都是一次性分配的,存储是固定连续的,而varchar的存储的长度是可变的,当varchar更改前后数据长度不一致时,就不可避免的会出现碎片的问题。针对此,需要进行碎片消除作业,也是额外的成本。


一般来说,长度固定的字段,还是用char比较合适,比如Hash,就很适合用char。



varchar(11)和int(11)中的50,有什么区别?

varcahr中代表能存11个字符,int中只是代表显示长度,对大多数应用没有意义,只是规定一些工具用来显示字符的个数,比如int(1)和int(20)存储和计算其实是一样的。



int(11)的11代表什么,这是个初学者很容易混淆的问题,其实它只是用于显示长度,不会影响存储空间。如果这个问题答错,会给面试官留下基础不扎实的印象。

接下来能说说delete和truncate的区别吗?

delete是删除行;truncate是整表删除。具体来说,有下面几点区别:


1.truncate之后,会释放空间;delete之后,不会释放空间,因为delete只是在行上标记删除,后续可以复用;


2.delete因为是DML,会产生redo log;truncate是DDL则不会;


3.truncate效率更高;

4.truncate之后,id从头开始;delete不会。





MySQL特性考察


你知道MySQL有哪些存储引擎吗?

首先有Innodb引擎,它提供了对数据库ACID事务的支持,并且还提供了行级锁和外键的约束。Innodb的设计目标就是处理大数据容量的数据库系统;


还有MyIASM引擎,它是原本Mysql的默认引擎,不提供事务的支持,也不支持行级锁和外键;


最后还有一个MEMORY引擎,它的所有数据都在内存中,数据的处理速度快,但是安全性不高,很少使用



那么ACID是什么呢?

它是原子性、一致性、隔离性和持久性的缩写。


原子性,指的是一个事务只有执行成功和失败回滚两种状态,没有中间态;一致性是说数据状态一定是一致的;隔离性是说事务之间互不影响;持久性是指事务执行完成后,对数据所做的操作持久的保存在数据库中。


从一定程序上来讲,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段





主键和外键分别是什么?

主键是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录。


外键是说某张表b的主键,在另一张表a中被使用,那么a中该字段可以使用的范围,取决于b。外键约束主要用来维护两个表之间数据的一致性。





那么一张表一定有主键吗?

是的。一定有。如果主动设置,则采用设置的。否则会自动生成一个默认的行。



你怎么查看有多少个Sql语句在执行?


可以用show processlist,它是显示用户正在运行的线程的命令。需要注意的是,用户都只能看到自己正在运行的线程,除非是root用户,或者专门进行了授权的用户。





MySQL是后台开发中非常重要的领域,更是面试环节的高频考点,十次面试有十一次都会被问到!


针对MySQl的问法各有不同,但基础知识是绕不过的,这些重点问题,如果在面试中遇到,要能找到联系并往上靠。


推荐阅读



推荐阅读