当前位置: 首页 > 科技观察

简单说说几个MySQL高频面试题

时间:2023-03-21 19:30:19 科技观察

前言:在各个技术岗位的面试中,好像经常会问到MySQL相关的问题。无论是面试开发岗位还是运维岗位,总会问到几个数据库问题。经常有朋友私信我问如何应对MySQL面试题。其实很多面试题都是大同小异的,提前准备还是很有必要的。本文简单说说几个常见的面试题,一起来学习吧。1.什么是关系型数据库?说说你对MySQL的理解。这是一个基本问题。考查面试官对数据库的理解程度。一般能简单说说自己的认知,有条理。例如:关系数据库是指使用关系模型组织数据的数据库,它以行和列的形式存储数据。关系型数据库最大的特点就是支持事务。常见的关系型数据库有MySQL、Oracle、SQLServer等,MySQL是当今最流行的开源数据库。由于其体积小、速度快、总体拥有成本低,尤其是开源的特点,许多公司使用MySQL数据库来降低成本。目前广泛应用于互联网上的中小型网站,尤其是OLTP领域。2、MySQL常用的存储引擎有哪些,有什么区别?这个问题经常被问到,类似于“InnoDB和MyISAM引擎的区别”这个问题。几种常见的存储引擎:InnoDB:MySQL默认的存储引擎,支持事务、MVCC、外键、行级锁和自增列。MyISAM:支持全文索引、压缩、空间函数、表级锁,不支持事务,插入速度快。内存:数据都在内存中,数据处理速度快,但安全性不高。ARCHIVE:常用于历史存档表,占用空间小,数据不能更新或删除。InnoDB和MyISAM引擎的一些区别:InnoDB支持事务,而MyISAM不支持事务。InnoDB支持外键,而MyISAM不支持。InnoDB不支持全文索引,而MyISAM支持。InnoDB是聚集索引,而MyISAM是非聚集索引。InnoDB不保存表的具体行数,而MyISAM使用变量保存整个表的行数。InnoDB最小的锁粒度是行锁,MyISAM最小的锁粒度是表锁。存储结构不同。MyISAM表分为三种:frmMYD和MYI,而InnoDB一般分为两种:frmibd。3.描述MySQL基础设施。本题考查面试官对MySQL架构的理解,类似于“一条select语句的执行过程”的问题。MySQL的逻辑架构图MySQL的逻辑架构主要分为三层:第一层:对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务器端有一个线程,查询由每个连接发起的连接将在相应的单独线程中执行。第二层:MySQL的核心服务功能层,包括查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select操作会先检查是否命中查询缓存,以及命中则直接返回缓存数据。解析查询并创建相应的解析树。第三层:存储引擎,负责数据的存储和提取。MySQL服务器通过API与存储引擎进行通信,屏蔽了各个引擎之间的差异。常见的存储引擎有:InnoDB、MyISAM。一条select语句的执行过程:客户端通过连接器与MySQL服务器建立连接,获得用户的读写权限,然后提交查询语句。首先,MySQL会在查询缓存中查询提交的语句。如果命中,且用户对该表有操作权限,则直接返回查询缓存中的查询结果作为本次查询的结果,查询到此结束。如果查询缓存未命中,它会转到分析器,分析器分析语句并检查其有效性。如果语句不符合MySQL的语法规范,执行器就会报错,查询到此结束。如果语句合法,就会来到优化器,优化器会为SQL语句选择最优的执行计划。最后,它涉及到执行者。如果用户对表有操作权限,执行器会调用存储引擎提供的接口执行SQL语句,然后将查询结果返回给客户端,查询到此结束。4.说说几种常用的字段类型。这道题考查面试官对MySQL字段类型的理解,可以延伸出很多小题,比如char和varchar的区别。常用字段类型分类:数值类型:字符串类型:日期时间类型:Minint(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索引可以分为聚簇索引和二级索引或辅助索引。聚集索引的叶节点存储整行数据。当查询使用聚簇索引时,只需要扫描聚簇索引的一颗B+树就可以得到需要的记录。如果想通过二级索引查找完整记录,需要回表,即通过二级索引找到主键值后,再到聚簇索引中查找完整记录。索引的优势显然是可以加快查询速度,但是创建索引也是有代价的。首先,每创建一个索引,都要为其建立一棵B+树,会占用额外的存储空间;其次,对表中的数据进行增删改查时,索引也需要动态维护,降低了数据维护的速度。因此,创建和使用索引是有原则的。通常,索引只为用于搜索、排序、分组和连接的列创建。尽量不要为选择性差的列创建索引。6、谈谈MySQL事务的特点和隔离级别。MySQL事务相关的问题经常被问到,一些基础的东西还需要深入研究。ACID的四个特性:A(Atomicity,原子性):事务中的操作要么成功要么失败。C(Consistency,一致性):数据库总是从一种一致状态过渡到另一种一致状态。如果约束被破坏,则不满足一致性条件。I(Isolation,隔离):一个事务的执行不能干扰其他事务。即一个事务内使用的操作和数据与其他并发事务隔离,并发执行的事务不能相互干扰。D(Durability,持久性):事务提交后,它所做的修改将永久保存到数据库中。事务隔离级别:未提交读(ReadUncommitted):一个事务中的修改,即使没有提交,对其他事务也是可见的。已提交读(ReadCommitted):一个事务中的修改在提交之前不会被其他事务看到。可重复读(RepeatableRead):在一个事务中多次查询同一条记录,结果始终一致(默认隔离级别)。Serializable:事务串行执行,读会加读锁,写会加写锁。并发事务带来的问题:脏读:事务A读取了事务B未提交的数据,然后B回滚了操作,那么A读取到的数据就是脏数据。不可重复读:事务A多次读取同一个数据,事务B在事务A的多次读取过程中更新并提交数据,导致事务A多次读取同一个数据,结果不一致。幻读:幻读类似于不可重复读。当一个事务A读取几行数据,然后另一个并发事务B插入一些数据时,就会发生这种情况。在后续的查询中,事务A会发现多了一条不存在的记录,好像出现了幻觉,所以称为幻读。