前言:

在各类技术岗位面试中,仿佛 MySQL 相干问题常常被问到。无论你面试开发岗位或运维岗位,总会问几道数据库问题。常常有小伙伴私信我,询问如何应答 MySQL 面试题。其实很多面试题都是大同小异的,提前做筹备还是很有必要的。本篇文章简略说下几个常见的面试题,一起来学习下吧。

1.什么是关系型数据库?谈谈你对 MySQL 的意识。

这是一道根底题,考查面试者对数据库的理解水平,个别能够简略讲下本人的认知,有条理即可。比方:

关系型数据库是指采纳了关系模型来组织数据的数据库,其以行和列的模式存储数据。关系型数据库最大的特点是反对事务。常见的关系型数据库有 MySQL、Oracle、SQLServer 等。MySQL 是当下最风行的开源数据库。因为其体积小、速度快、总体领有成本低,尤其是开放源码这一特点,使得很多公司都采纳 MySQL 数据库以降低成本,目前被宽泛地利用在 Internet 上的中小型网站中,尤其实用于 OLTP 畛域。

2.MySQL 常见的存储引擎有哪些,有什么区别?

这个问题也常常被问到,和『InnoDB 与 MyISAM 引擎的区别』问题类似。

常见的几种存储引擎:

  • InnoDB: MySQL 默认的存储引擎,反对事务、MVCC、外键、行级锁和自增列。
  • MyISAM: 反对全文索引、压缩、空间函数、表级锁,不反对事务,插入速度快。
  • Memory: 数据都在内存中,数据的处理速度快,然而安全性不高。
  • ARCHIVE: 罕用于历史归档表,占用空间小,数据不能更新删除。

InnoDB 与 MyISAM 引擎的几点区别:

  • InnoDB 反对事务,MyISAM 不反对事务。
  • InnoDB 反对外键,而 MyISAM 不反对。
  • InnoDB 不反对全文索引,而 MyISAM 反对。
  • InnoDB 是聚簇索引,MyISAM 是非聚簇索引。
  • InnoDB 不保留表的具体行数,而 MyISAM 用一个变量保留了整个表的行数。
  • InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。
  • 存储构造不同,MyISAM 表分为 frm MYD MYI 三个,InnoDB 个别分为 frm ibd 两个。

3.形容下 MySQL 基础架构。

这个问题考查面试者对 MySQL 架构的理解,和『一条 select 语句执行流程』问题类似。


MySQL的逻辑架构图(起源:《MySQL实战45讲》)

MySQL的逻辑架构次要分为3层:

  1. 第一层:对客户端的连贯解决、平安认证、受权等,每个客户端连贯都会在服务端领有一个线程,每个连贯发动的查问都会在对应的独自线程中执行。
  2. 第二层:MySQL的外围服务性能层,包含查问解析、剖析、查问缓存、内置函数、存储过程、触发器、视图等,select操作会先查看是否命中查问缓存,命中则间接返回缓存数据,否则解析查问并创立对应的解析树。
  3. 第三层:存储引擎,负责数据的存储和提取,MySQL服务器通过API与存储引擎通信,屏蔽了各种引擎之间的差别,常见的存储引擎有:InnoDB、MyISAM。

一条 select 语句执行流程:

  • 客户端通过连接器与 MySQL 服务器建设连贯,并获取了用户的读写权限,而后提交查问语句。
  • 首先 MySQL 会在查问缓存中对提交的语句进行查问,如果命中且用户对表有操作权限,会间接返回查问缓存中查问后果作为本次查问的后果,查问到此结束。
  • 如果查问缓存未命中,会来到分析器,分析器会解析语句并查看其合法性。如果语句不合乎 MySQL 的语法标准,执行器会报错,查问到此结束。
  • 若语句非法,会来到优化器,优化器会为 SQL 语句抉择最优的执行打算。
  • 最初来到执行器,如果用户对表有操作权限,执行器会调用存储引擎提供的接口来执行 SQL 语句,而后将查问后果返回给客户端,查问到此结束。

4.说说罕用的几种字段类型。

这个问题考查面试者对 MySQL 字段类型的理解水平,能够延长出很多小问题,例如 char 与 varchar 的区别。

罕用的字段类型分类:

数值型:

字符串类型:

日期和工夫类型:

int(M)中的 M 代表最大显示宽度,"最大显示宽度"咱们第一反馈是该字段的值最大能容许寄存的值的宽度,认为咱们建了int(1),就不能存放数据10了, 其实不是这个意思,int(5)和int(10)可存储的范畴一样。

CHAR类型是定长的,MySQL总是依据定义的字符串长度调配足够的空间。当保留CHAR值时,在它们的左边填充空格以达到指定的长度,当检索到CHAR值时,尾部的空格被删除掉。VARCHAR类型用于存储可变长字符串,存储时,如果字符没有达到定义的位数,也不会在前面补空格。char(M) 与 varchar(M)中的的 M 都示意保留的最大字符数,单个字母、数字、中文等都是占用一个字符。

5.讲讲索引的作用及构造及应用标准。

对于索引,能有好多好多问题,可能几篇文章也写不明确。简略分享下这类问题的答复:

索引的目标在于进步查问效率。能够类比字典中的目录,查找字典内容时能够依据目录查找到数据的寄存地位,而后间接获取即可。索引是表的目录,在查找内容之前能够先在目录中查找索引地位,以此疾速定位查问数据。

InnoDB 引擎下,次要应用的是 B+Tree 索引,每个索引其实都是一颗B+树,B+树是为了磁盘及其他存储辅助设施而设计的一种均衡查找树(不是二叉树),在B+树中,所有的数据都在叶子节点,且每一个叶子节点都带有指向下一个节点的指针,造成了一个有序的链表。

从物理存储角度来看,InnoDB 索引可分为聚簇索引(clustered index)和二级索引(secondary index)或辅助索引。聚簇索引的叶子节点存的是整行数据,当某条查问应用的是聚簇索引时,只须要扫描聚簇索引一颗B+树即可失去所需记录,如果想通过二级索引来查找残缺的记录的话,须要通过回表操作,也就是在通过二级索引找到主键值之后再到聚簇索引中查找残缺的记录。

索引的长处不言而喻是能够减速查问,但创立索引也是有代价的。首先每建设一个索引都要为它建设一棵B+树,会占用额定的存储空间;其次当对表中的数据进行减少、删除、批改时,索引也须要动静的保护,升高了数据的保护速度。所以,索引的创立及应用时有准则的,个别只为用于搜寻、排序、分组、连贯的列创立索引,选择性差的列尽量不创立索引。

6.讲下 MySQL 事务的个性及隔离级别。

MySQL 事务相干问题也常常被问到,一些原理性的货色还是须要深刻去学习的。

ACID 四个个性:

  • A(Atomicity,原子性):一个事务中的操作要么都胜利,要么都失败。
  • C(Consistency,一致性):数据库总是从一个一致性状态转换到另一个一致性状态,若毁坏束缚,则不满足一致性条件。
  • I(Isolation,隔离性):一个事务的执行不能其它事务烦扰。即一个事务外部的操作及应用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能相互烦扰。
  • D(Durability,持久性):事务在提交当前,它所做的批改就会被永恒保留到数据库。

事务隔离级别:

  • 读未提交(Read Uncommitted):事务中的批改,即使没有提交,对其余事务也都是可见的。
  • 读已提交(Read Committed):事务中的批改只有在提交之后,才会对其余事务可见。
  • 可反复读(Repeatable Read):一个事务中屡次查问雷同的记录,后果总是统一的(默认的隔离级别)。
  • 可串行化(Serializable):事务都是串行执行的,读会加读锁,写会加写锁。

并发事务带来的问题:

  • 脏读(Dirty Reads):事务A读取了事务B未提交的数据,而后B回滚操作,那么A读取到的数据是脏数据。
  • 不可反复读(Non-Repeatable Reads):事务 A 屡次读取同一数据,事务B在事务A屡次读取的过程中,对数据作了更新并提交,导致事务A屡次读取同一数据时,后果不统一。
  • 幻读(Phantom Reads):幻读与不可反复读相似。它产生在一个事务A读取了几行数据,接着另一个并发事务B插入了一些数据时。在随后的查问中,事务A就会发现多了一些本来不存在的记录,就如同产生了幻觉一样,所以称为幻读。

参考:

  • https://juejin.cn/post/6895526108729442318