数据库面试题及答案(19道常见必考题解析)

数据库面试题及答案(19道常见必考题解析)-mikechen

在数据库中查询语句速度很慢,如何优化?

① 建立索引;

② 减少表之间的关联;

③ 优化sql语句,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的排在前面;

④ 简化查询字段,没用的字段不要;

⑤ 尽量用PreparedStatement来查询,不要用Statement。

 

MySQL 语句执行的步骤?

主要包含如下执行步骤:

  1. 客户端请求: 连接器(验证用户身份,给予权限);
  2. 查询缓存:存在缓存则直接返回,不存在则执行后续操作;
  3. 分析器:对 SQL 进行词法分析和语法分析操作;
  4. 优化器:主要对执行的 SQL 优化选择最优的执行方案方法;
  5. 执行器:执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口-> 去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)。

 

数据库三范式?

第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项;

第二范式(2NF):满足第一范式,且不存在部分依赖,即非主属性必须完全依赖于主属性;

第三范式(3NF):满足第二范式,且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。

简单来说:

第一范式:列表字段不可分;

第二范式:有主键且非主键依赖主键;

第三范式:非主键字段不能相互依赖。

 

什么时候要创建索引?

(1)表经常进行 SELECT 操作;

(2)表很大(记录超多),记录内容分布范围很广;

(3)列名经常在 WHERE 子句或连接条件中出现。

 

什么时候不要创建索引?

(1)表经常进行 INSERT/UPDATE/DELETE 操作;

(2)表很小(记录超少);

(3)列名不经常作为连接条件或出现在 WHERE 子句中。

 

常用的索引有哪些类型?

  1. 唯一索引:唯一索引不允许两行具有相同的索引值;
  2. 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空;
  3. 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个;
  4. 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针,可以有多个,小于249个。

 

binlog是什么?有什么作用?

1、数据恢复

只要有数据库在某个时刻的备份以及此时后的所有binlog,就可以恢复数据库的数据。

在我们的日常工作中,我们的DBA学生经常可以帮助我们将数据库的数据恢复到任何一秒。

2、主从复制

为了提高MySQL的效率,经常做读写分离,即一主多从。

一个主库(写库),多个从库(读库)。

此时,从库可以监控主库的binlog日志,同步写库的所有更改操作。

 

为什么需要 redo log?

mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用,然后使用后台线程去做缓冲池和磁盘之间的同步。

那么问题来了,如果还没来的同步的时候宕机或断电了怎么办?还没来得及执行上面图中红色的操作,这样会导致丢部分已提交事务的修改信息。

所以引入了redo log来记录已成功提交事务的修改信息,并且会把redo log持久化到磁盘,系统重启之后在读取redo log恢复最新数据。

总结:redo log是用来恢复数据的 用于保障,已提交事务的持久化特性。

 

MySQL 的 redo log 和 binlog 区别?

详细的区别如下图所示:

数据库面试题及答案(19道常见必考题解析)-mikechen

 

事务四大特性?

事务应该具有4个属性:原子性、一致性、隔离性、持久性,这四个属性通常称为ACID特性。

  1. 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行;
  2. 一致性:指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的;
  3. 隔离性:多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离;
  4. 持久性:表示事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

 

MySQL事务隔离级别有哪些?

MySQL 事务隔离级别总共有以下 4 种:

  1. READ UNCOMMITTED:读未提交;
  2. READ COMMITTED:读已提交;
  3. REPEATABLE READ:可重复读;
  4. SERIALIZABLE:序列化。

 

MyISAM 和 InnoDB 实现 B 树索引方式的区别是什么?

InnoDB 存储引擎:B+ 树索引的叶子节点保存数据本身,其数据文件本身就是索引文件;

MyISAM 存储引擎:B+ 树索引的叶子节点保存数据的物理地址,叶节点的 data 域存放的是数据记录的地址,索引文件和数据文件是分离的。

 

MySQL的表有哪些?并分别说明它们?

数据库面试题及答案(19道常见必考题解析)-mikechen

有四种不同类型的联接:

  • 内部联接:返回两个表中具有匹配值的记录;
  • 左联接:返回左表中的所有记录以及右表中的匹配记录;
  • 右连接:从右表返回所有记录,并从左表返回匹配的记录;
  • 完全连接:当左表或右表中存在匹配项时,返回所有记录。

 

B树和B+树的区别?

B树与B+树的区别有两个:

1)B树的非叶子节点是存储数据的,而B+树的非叶子节点只存储索引信息;

2)B+树的非最右侧的叶子节点向右会指向右侧的叶子节点,形成一个有序的连表.

在查找数据的时候,B树需要根据数据是比较查找查询次数比较多,由于B+树存储的是数据的索引,所以只有一次IO就可以查找到数据,而且B+树非叶子节点只存储索引,所以能存储更多的索引,使树的高度降低。

 

B+树索引和哈希索引的区别?

B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的,如下图:

数据库面试题及答案(19道常见必考题解析)-mikechen

哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可,是无序的,如下图所示:

数据库面试题及答案(19道常见必考题解析)-mikechen

 

INNER JOIN 和 LEFT JOIN 有什么区别?

INNER JOIN用于包含两个表中符合ON条件的组合行,最终结果不包括与ON条件不匹配的行。

LEFT JOIN用于保留第一个表中的所有行,无论第二个表中是否存在与ON条件匹配的行。

数据库面试题及答案(19道常见必考题解析)-mikechen

 

什么是聚集索引和非聚集索引?

聚集索引:聚集索引是索引结构和数据一起存放的索引,类似于字典的正文,当我们根据拼音直接就能找到那个字。

非聚集索引:非聚集索引是索引结构和数据分开存放的索引,类似于根据偏旁部首找字,首先找到该字所在的地址,再根据地址找到这个字的信息。

 

mysql都有什么锁?

基于锁的属性分类:共享锁(读锁)、排他锁(写锁)。

基于锁的粒度分类:行级锁((innodb )、表级锁( innodb、myisam)、页级锁( innodb引擎)、记录锁、间隙锁、临键锁。

基于锁的状态分类:意向共享锁、意向排它锁(一般不用)。

 

MySQL存储引擎InnoDB、MyISAM的区别?

数据库面试题及答案(19道常见必考题解析)-mikechen

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法