我当面试官,面你 MySQL 基础
共 3084字,需浏览 7分钟
·
2021-09-28 02:20
基本概念
你能谈谈MySQL是什么吗?
MySQL是一个传统的RDBM数据库,也就是关系型数据库,广泛应用于OLTP场景。
你提到了OLTP,能说说它和OLAP的区别是什么吗?
OLTP(联机事务处理)是传统的关系型数据库的主要应用,用于基本的、日常的事务处理,例如银行的交易记录;
而OLAP(联机分析处理)是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供了直观易懂的查询结果。最常见的应用就是复杂的动态报表系统。
总体来说,OLTP用于日常处理、OLAP用于数据分析。
你知道数据库的三范式分别是什么吗?
第一范式:字段不可分。强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项;
第二范式:有主键,非主键字段依赖主键。要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性;
第三范式:非主键字段不能相互依赖,任何非主属性不依赖于其它非主属性。
DML是什么呢?
DML是数据操作语言,用于检索或者修改数据。我们平常最常用的增删查改就是DML。
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,有什么区别?
接下来能说说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的问法各有不同,但基础知识是绕不过的,这些重点问题,如果在面试中遇到,要能找到联系并往上靠。
推荐阅读