数据库面试

索引
优点:
  1. 提高数据检索效率,降低数据库的IO成本,这也是创建索引最主要的原因
  2. 通过创建唯一索引,保证数据库中每一行数据的唯一性
  3. 加速表与表之间的连接
  4. 减少查询分组和排序的时间,因为本身是排好序的
缺点:
  1. 创建索引和维护索引要耗费时间,因为索引是排好序的,像中间插入和修改都会大规模的维护索引
  2. 索引也要占磁盘空间
  3. 索引大大提高了查询速度,但同时也降低了更新的速度,增加修改维护的时候索引也要动态的维护。

聚簇索引(主键索引):一般来说就是主键的索引,记录了全部的数据

二级索引:一般来说就是别的字段构成的索引,一般来说只记录这条数据信息和主键,二级索引查询涉及到回表。

事务

1.事务的ACID特性
  • 原子性(atomicity)

原子性是指事务是一个不可分割的工作单位,要么全部成功,要么全部失败,就好像是一个操作一样,没有中间状态。如果不存在原子性,例如转账时如果失败,则会发生一个-100另一个账户却没有+100。那显然是不对的。

  • 一致性(consistency)
  • 在这里插入图片描述
  • 隔离性(isolation)

事务的隔离性是指一个事务的执行不会被其他的事务干扰,就是一个事务的内部操作对并发执行的其他事务是隔离的。并发执行的事务不会互相干扰。

例如:
在这里插入图片描述

  • 持久性(durability)

持久性是指一个事务一旦被提交,对数据库的改变就是永久性的接下来的其他操作和数据库的故障都不会对其有任何影响。

持久性是通过事务日志来保障的,日志包括重做日志和回滚日志,当我们对数据库进行修改的时候首先会将数据库的变化记录在重做日志中,然后对数据库进行修改,这样即使数据库崩溃重启后也能找到重做日志,来保证数据库的持久性。

总结

ACID是数据库的四个特性,原子性是基础,隔离性是手段,一致性是约束,持久性是目的。

数据库事务就是需要把原子性,隔离性,一致性,持久性的一个或多个数据库操作称为一个事务。

2.数据并发问题

2.1 脏写(Dirty write)

对于两个事务如果事务A修改了事务B修改了但是未提交的数据。那就意味着发生了脏写。

2.2 脏读(Dirty read)

就是读未提交。例如事务A读到了事务B修改了但是还没有提交的数据,然后事务B回滚了,这时候事务A 所读到的数据就是临时且无效的。

2.3 不可重复读(Non-Repeatable Read)

事务A读一个数据,然后事务B对这个数据进行了更新并提交,然后A再读取数据就会不一样这时候就是发生了不可重复读。

(不是很理解)

2.4 幻读(Pantom)

事务A读取数据库从一个表中读取一个字段,然后B进行插入,如果A再次读取同一张表就会多出几行数据,像发生幻觉一样。

新插入的记录叫幻影记录,删除的不算。

按照问题的严重性排个序:

脏写 > 脏读 > 不可重复读 > 幻读

3.四种隔里级别

四种隔离级别就是为了解决上述问题的

  • 读未提交:只解决了脏写,一般不用
  • 读已提交:解决了脏读,oracle的默认隔离级别
  • 可重复读: mysql默认的隔离级别
  • 可串行化:加锁,不支持并发,一个事务执行其余的都排队等待。

在这里插入图片描述

死锁

死锁产生的原因大致有两个:资源竞争和程序执行顺序不当

死锁的四个条件
  • 互斥条件:每个资源都被分配给了一个进程或者资源是可用的
  • 保持和等待条件:已经获取资源的进程被认为能够获取新的资源
  • 不可抢占条件:分配给一个进程的资源不能强制的从其他进程抢占资源,它只能由占有它的进程显示释放
  • 循环等待:死锁发生时,系统中一定有两个或者两个以上的进程组成一个循环,循环中的每个进程都在等待下一个进程释放的资源。
死锁的恢复方式

通过抢占进行恢复 :这种恢复方式一般比较困难而且有些简单粗暴,并不可取。

通过回滚进行恢复: 如果知道可能会发生死锁,就定期检查记录检查点

杀死进程恢复

鸵鸟法 如果死锁并不会有严重的后果,就不去管他,因为解开死锁非常困难

如何破坏死锁

从死锁的四种必要条件入手

  • 破坏互斥条件,不过很难,因为两个线程同时使用一个资源可能会造成混乱。

  • 破坏请求保持条件 如果进程开始执行之前就知道是否全部资源可用就可以使用银行家算法,还有一种方式是进程在请求其他资源时,先释放所占用的资源,然后再尝试一次获取全部的资源

  • 破坏不可被抢占条件

  • 破坏循环等待条件

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值