面试题锦集:1、数据库三大范式,2、mysql索引类型及作用,3、事务的特性和隔离级别
面试题集锦
一、数据库三大范式
第一范式(1NF):
指数据库中表的每一列都是不可分割的最小单位
# 分割前:
地址
安徽省合肥市蜀山区
# 分割后:
省 | 市 | 区
安徽省|合肥市|蜀山区
第二范式(2NF):
如果表是单主键,那么主键以外的列必须完全依赖于主键列,如果表是符合主键(联合索引),那么主键以外的列必须完全依赖于主键,而不是主键的一部份
第三范式(3NF):
表中的非主键列必须直接依赖于主键列,而不是间接依赖于主键,也就是说非主键列不能间接依赖于主键列,出现这种情况应该在建立一张关联表而不是存放在一张表中
二、mysql有哪些索引类型及作用
首先先说一下什么是索引及索引的作用:
在关系型数据库中,给一个或多个字段(联合索引)设置索引,可以加快数据检索(类似于目录),达到快速查找的作用
普通索引:
允许该字段出现重复的值,且可以为空
唯一索引:
不允许该字段出现重复值,且不可以为空
主键索引:
非空且唯一,在不主动生成的情况下数据库会默认生成一个字段为主键(一般是id字段),非空且唯一
联合索引:
多个字段联合唯一
全文索引:
所有字段都作为索引条件,一般用的比较少,如果删除或修改字段可能照成B树结构改变,在数据量庞大的情况下不建议使用(主要根据业务逻辑来判断是否使用)
三、事务的特性和隔离级别
1、事务的四大特性
原子性(Atomicity):
事务一旦提交,要么全部成功,要么全部失败
隔离性(Isolation):
事务之间相互隔离,不受影响
一致性(Consistency):
一个事务开启后,在这个事务中多次查询数据的结果都必须是一致的
持久性(Durable):
事务一旦提交,对数据的影响是永久的,不可回滚
2、事务的隔离级别
未提交读(READ UNCOMMITTED):
事务的最低级别,会造成脏读、不可重复读、幻读
已提交读(READ COMMITTED):
该级别解决了脏读,但不可重复读和幻读任然存在
可重复度(REPEATABLE READ):
该级别是mysql5.7版本后默认的事务级别,该级别解决了脏读、不可重复度
串行化(SERIALIZABLE):
事务的最高级别,解决了脏读、不可重复读、幻读,该级别极大的保证了数据的安全性,缺点是无并发可言
事务的隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读(READ UNCOMMITTED) | √ | √ | √ |
已提交读(READ COMMITTED) | - | √ | √ |
可重复度(REPEATABLE READ) | - | - | √ |
串行化(SERIALIZABLE) | - | - | - |
3、什么是脏读、不可重复度、幻读
脏读:
指A在事务的过程中可以读取到B修改单位提交的数据
不可重复度:
指在同一个事务中,多次读出数据,出现数据不一致的情况,这种情况通常是update和delete(数据前后不一致或开始时候读取存在,后来就消失了)
幻读:
很多人会把幻读和不可重复读混淆,幻读指在同一个事务的过程中,多次读取数据时,出现了新的数据(insert)
4、解决办法
机制锁:
- ru:最低级别,不加锁
- rc:开启事务时加行级锁,读到的时候加锁,读取完毕释放锁
- rr:开启事务时加行级锁,关闭事务时释放
- se:开启事务加表锁,关闭事务释放锁
MVCC机制:
- 保存某个时间上的数据快照