校招面经(二)

155 阅读9分钟

SQL语句

三大范式?

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

第二范式:关系模式必须满足第一范式,并且所有非主属性都完全依赖于主码。注意,符合第二范式的关系模型可能还存在数据冗余、更新异常等问题。关系模型(学号,姓名,专业编号,专业名称)中,学号->姓名,而专业编号->专业名称,不满足数据库第二范式

第三范式:关系模型满足第二范式,所有非主属性对任何候选关键字都不存在传递依赖。即每个属性都跟主键有直接关系而不是间接关系。接着以学生表举例,对于关系模型(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)院校地址,院校电话和学号不存在直接关系,因此不满足第三范式。

SQL语句执行过程?

  1. 客户端首先通过连接器进行身份认证和权限相关
  2. 如果是执行查询语句的时候,会先查询缓存,但MySQL 8.0 版本后该步骤移除。
  3. 没有命中缓存的话,SQL 语句就会经过解析器,分析语句,包括语法检查等等。
  4. 通过优化器,将用户的SQL语句按照 MySQL 认为最优的方案去执行。
  5. 执行语句,并从存储引擎返回数据。

MySQL

MySQL架构?

MySQL可以分为应用层,逻辑层,数据库引擎层,物理层。

应用层:负责和客户端,响应客户端请求,建立连接,返回数据。

逻辑层:包括SQK接口,解析器,优化器,Cache与buffer。

数据库引擎层:有常见的MyISAM,InnoDB等等。

物理层:负责文件存储,日志等等。

事务隔离级别有哪些?MySQL的默认隔离级别?

1、READ UNCOMMITTED(读取未提交) :最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

2、READ COMMITTED(读取已提交) :允许读取并发事务已经提交的数据 ,可以阻止脏读,但是幻读或不可重 复读仍有可能发生。

3、REPEATABLE READ(可重复读) :对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生

4、SERIALIZABLE(可串行化) :最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

MySQL InnoDB存储引擎的默认支持的隔离级别是REPEATABLE READ(可重复读) 。 InnoDB存储引擎在REP EATABLE READ(可重读)事务隔离级别下使用的是Next Key Lock锁算法,因此可以避免幻读的产生。

MySQL的索引结构有哪些?各自的优劣势是什么?

索引的数据结构和具体存储引擎有关,MySQL中使用较多的索引有B+索引,哈希索引,InnoDB的索引实现为B+树,Memory存储引擎为哈希索引。

B+树是一个平衡多叉树,在常规的检索中,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率较高。因此B+树被广泛引用于数据库、文件系统等场景。

Hash索引就是采用一定的哈希算法,把键值换算成新的Hash值,检索时不需要类似于B+树那样从根节点到叶子节点足迹查找,只需要一次哈希算法即可立刻定位到相应的位置,速度非常快。

如果是等值查找,那么使用哈希索引明显有绝对优势,如果是范围查找,原先有序的键值,经过Hash算法后,有可能变成不连续的了,就没办法利用索引完成范围查询检索

在有大量重复键值的情况下,哈希索引的效率也是极低的,因此存在哈希碰撞问题。

所以,哈希索引也没有办法利用索引完成排序,以及like这样的部分模糊查询,也不支持多列联合索引的最左匹配规则

B+树索引的关键字检索效率比较平均,波动较小

B树和B+树的区别?

B树的所有节点及存放Key又存放data,B+树只有叶子结点存放Key和data,其他节点只存在key。

B树的叶子节点是独立的,B+树的叶子节点有一条引用链指向他相邻的叶子节点

B树的检索过程相当于对范围内的每个节点的关键字做二分查找,可能还没达到叶子节点就结束了。B+树的效率很稳定,任何查找都是从根节点到叶子结点的过程。

MySQL中索引类型有哪些,以及对数据库的性能的影响?

普通索引:允许被索引的数据列包含重复的值

唯一索引:可以保证数据记录的唯一性

主键索引:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字primary key来创建,可以包含多个列

联合索引:索引可以覆盖多个数据列

全文索引:通过建立倒排索引,可以极大的提升检索效率,判断解决字段是否包含的问题,是目前搜索引擎使用的一种关键技术

索引可以极大地提高数据的查询速度

通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

但是会降低插入、删除、更新表的速度,因为在执行这些操作的时候,还要操作索引文件

索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果遍历聚簇索引,那么需要的空间就会更大,如果非聚簇索引很多,一旦聚簇索引改变,那么所有的非聚簇索引都会跟着变

MySQL主从复制原理?

为什么需要主从复制?

1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

2、做数据的热备

3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

定义:

MySQL主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL默认采用异步复制方式,这样节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或特定的数据库,或者特定的表。

原理:

(1)master服务器将数据的改变记录二进制bin.log日志,当master上的数据发生改变时,则将其改变写入二进制日志中;

(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件

(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

也就是说

从库会生成两个线程,一个I/O线程,一个SQL线程;

I/O线程会去请求主库的binlog,并将得到的bin.log写到本地的relay-log(中继日志)文件中;

主库会生成一个log dump线程,用来给从库I/O线程传bin.log;

SQL线程,会读取relay.log文件中的日志,并解析成sql语句逐一执行;

注意:

1、master将操作语句记录到bin.log日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启bin.log功能)。

2、slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay.log里;SQL线程负责从relay.log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。

3、Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。

4、Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)

5、master和slave两节点间时间需同步

具体步骤:

1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user 、password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start slave

2、从库的IO线程和主库的dump线程建立连接。

3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。

4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。

5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到master.info中

6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的relay 会自动被清理purge