1.请说下你对 MySQL 架构的了解?
MySQL 的架构可以分为三层:
-
连接层:负责接收客户端连接请求,并根据连接请求的用户名和密码进行身份验证,如果验证成功,就建立与客户端的连接。
-
服务层:负责查询解析、优化、缓存、以及所有的内置函数(例如时间函数、数学函数等)的执行。除此之外,它还提供了存储引擎的接口,不同的存储引擎实现了不同的数据存储方式。MySQL 自带的存储引擎包括 MyISAM 和 InnoDB 等,它们的性能、可靠性等方面有所不同。
-
存储层:负责将数据存储到磁盘上,具体实现由存储引擎来完成。MySQL 中的 InnoDB 存储引擎支持事务操作,同时也支持行锁和表锁等多种不同级别的锁定机制,保证数据的一致性和可靠性。
2.一条 SQL 语句在数据库框架中的执行流程?
-
连接器:应用程序把查询 SQL 语句发送给服务器端执行;
-
查询缓存:如果查询缓存是打开的,服务器在接收到查询请求后,并不会直接去数据库查询,而是在数据库的查询缓存中找是否有相对应的查询数据,如果存在,则直接返回给客户端。只有缓存不存在时,才会进行下面的操作;
-
分析器和优化器:查询优化处理,生成执行计划。这个阶段主要包括解析 SQL、预处理、优化 SQL 执行计划;
-
执行器:MySQL 根据相应的执行计划完成整个查询;
-
将查询结果返回给客户端。
3.数据库的三范式是什么?
-
1NF:强调的列的原子性,字段(列)不可再分(如个人信息表,联系方式字段还可以再分为QQ,微信,电话等)
-
2NF:在1NF基础上,消除非主属性对键的部分依赖(如成绩表,主键学生id,学科id,不应该出现学生班级信息之类的字段)
-
3NF:在2NF基础上,消除非主属性对键的传递依赖(学生属性属于学生,班级属性属于班级)
4.char 和 varchar 的区别?
char(n) :固定长度类型,比如:订阅 char(10),当你输入”abc”三个字符的时候,它们占的空间还是 10 个字节,其他 7 个是空字节。char 优点:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的,使用 char 非常合适。
varchar(n) :可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
所以,从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适,二者使用需要权衡。
5.varchar(10) 和 varchar(20) 的区别?
-
存储空间不同,varchar(10) 中 10 的涵义最多存放 10 个字符,后者20
-
索引效率不同,varchar(10) 和 varchar(20) 存储 hello 所占空间一样,varchar(20)由于占用空间更大,会造成磁盘 I/O 操作更频繁,因此效率相对较低。
-
数据精度不同,varchar(10)可以存储的数据精度更高,因为其所允许的最大长度相对较小,输入的数据可以更精确。
6.谈谈你对索引的理解?
-
索引的出现是为了提高数据的查询效率,就像书的目录一样。一本500页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。
-
主键索引:在数据表的主键字段创建的索引,这个字段必须被primary key修饰,每张表只能有一个主键
-
唯一索引:在数据表中的唯一列创建的索引(unique),此列的所有值只能出现一次,可以为NULL
-
普通索引:在普通字段上创建的索引,没有唯一性的限制
-
组合索引:两个及以上字段联合起来创建的索引
7.索引的底层使用的是什么数据结构?
-
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有 Hash 索引、B+树索引等。
-
而我们经常使用的 InnoDB 存储引擎的默认索引实现为 B+ 树索引。
8.谈谈你对 B+ 树的理解?
-
B+树是一种常见的平衡树结构,主要用于数据库系统中的索引管理。
-
B+树的特点如下:
-
所有数据都保存在叶子结点中。非叶子结点仅用于索引,不存储数据。
-
叶子结点之间通过指针互相连接,形成一个有序的链表。
-
所有叶子结点的深度相同,因此可以进行批量读取,减少磁盘I/O操作次数。
-
每个结点可以存储更多的关键字信息,可以减少树的层数,从而进一步提高查询效率。
9.请你描述下事务的特性?
ACID特性,高频面试题
原子性(Atomicity):一个事务中的多个DML操作,要么同时执行成功,要么同时执行失败
一致性(Consistency):事务执行之前和事务执行之后,数据库中的数据是一致的,完整性和一致性不能被破坏
隔离性(Isolation):数据库允许多个事务同时执行(张三借Java书的同时允许李四借Java书),多个必行的事务之间不能相互影响
持久性(Durability):事务完整之后,对数据库的操作是永久的
10.谈谈你对事务隔离级别的理解?
-
读未提交(脏读:一个事务读取到了另一个事务中未提交的数据)
-
读以提交(虚读:在同一个事务中,两次查询操作读取到数据不一致)
-
可重复读(幻读:T2对数据表中的数据进行修改然后查询,在查询之前T1向数据表中新增了一条数据,就导致T2以为修改了所有数据,但却查询出了与修改不一致的数据(T1事务新增的数据))
-
串行化(同时只允许一个事务对数据表进行操作;避免了脏读、虚读、幻读问题)
11.解释下什么叫脏读、不可重复读和幻读?
-
脏读:一个事务读取到了另一个事务中未提交的数据
-
虚读:在同一个事务中,两次查询操作读取到数据不一致。T2进行第一次查询之后在第二次查询之前,T1修改并提交了数据,T2进行第二次查询时读取到的数据和第一次查询读取到数据不一致。
-
幻读:T2对数据表中的数据进行修改然后查询,在查询之前T1向数据表中新增了一条数据,就导致T2以为修改了所有数据,但却查询出了与修改不一致的数据(T1事务新增的数据)
12.MySQL 默认的隔离级别是什么?
-
MySQL默认的隔离级别是可重复读(Repeatable Read)级别。在可重复读级别下,事务可以多次读取同一数据,读取到的数据与其他事务的修改是隔离的,即不受其他并发事务的影响。这意味着在同一事务中多次执行相同的查询语句,会得到一致的结果。
13.SQL 与 MySQL 有什么区别
SQL 和 MySQL 是 DBMS 中最令人困惑的两个术语,二者之间存在本质上的区别。
-
SQL 是一种 结构化查询语言,用于在数据库上执行各种操作,但 MySQL 是一个 关系数据库管理系统(RDBMS),使用 SQL 执行所有数据库操作。
-
SQL 用于访问,更新和操作数据库中的数据,用户使用时需要学习该语言,然后编写查询,而 MySQL 是一个软件,会为用户提供一个界面,只需单击一些按钮即可用于执行各种数据库操作。
-
由于 MySQL 是一个软件,所以它会定期获得各种更新,但在 SQL 中,命令总是相同的。
14.为什么要分库分表
数据库中的数据量不一定是可控的,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地数据操作,例如 增删改查的开销 也会越来越大;另外,若不进行分布式部署,而一台服务器的 资源 (CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。所以,从 性能 和 可用性 角度考虑,会进行数据库拆分处理,具体地说,把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上,即 分库分表。