共计 3305 个字符,预计需要花费 9 分钟才能阅读完成。
本篇内容介绍了“MySQL 的高频面试题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
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 的逻辑架构主要分为 3 层:
鸿蒙官方战略合作共建——HarmonyOS 技术社区
第一层:对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。
第二层:MySQL 的核心服务功能层,包括查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select 操作会先检查是否命中查询缓存,命中则直接返回缓存数据,否则解析查询并创建对应的解析树。
第三层:存储引擎,负责数据的存储和提取,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 就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
“MySQL 的高频面试题有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!