【转】如何应对面试中的数据库问题
很多同学并不是数据库的专家,面试如果问到数据库并没有太多信心,面试数据库是有窍门的,因为数据库是一个庞大的系统,面试的时候没有办法考得很深,而且有一些题目是被反复问到的,大家可以提前准备。在这里我只提供答题思路,一来可以避免大家在面试的时候答案比较雷同,二来可以通过准备答案的过程学习些数据库的知识。
回答数据库的问题,需要有一定的高度,因为数据库是一个整体,牵一发而动全身,因此任何一个小的知识点都会牵动着很多相关的知识,回答问题的时候,需要站在一个高度上去分析,并把相关的内容以及联系都讲清楚,最重要的是要展现你的答题思路以及开放性的思维。
1. 数据库如何避免死锁
首先从数据库避免死锁的一般方法谈起,然后分别说明各种方法的应用场景以及在不同应用场景下锁的类型,并举例在什么时候应用并说明原因,还要说明不同机制在什么情况下可能发生死锁,最后提出改进意见。
2. 脏读和幻象问题
这个是个事务的问题,这个时候首先简单说一下为什么会发生以及解决方案,然后说明MVCC的简单的实现原理,可以对数据锁定进行展开讲一些内容,可以讲一下undo和redo在的应用以及XA事务的实现原理
3. 举一个优化的例子
这是一个开放式的问题,可以很好的按照你的思路去走,当然这个需要大家自己准备。但是例子需要简单,并且需要从理论上可验证,并且可监控,能够推到出一个结论,然后比较实际与理论的不同以及除了已经分析的内容,还有什么其他的影响因素。
4. Left outer join
这个只是一个考基础理论的题目,但是这里面还有一些可以拓展的内容,比如在什么情况 Left outer join 可以转化为 inner join, Left outer join 与 Union all 的比较,以及谓词在ON以及WHERE中的异同,以及 Left outer join 会如何影响查询计划等等。
5. Cluster index 以及 non-cluster index 的异同
首先要要知道 cluster index 的优势在什么地方,通常来说,通过 cluster index 的访问会快一些,解释一下原因,并说明在什么情况下,Cluster index 的访问不据优势。借此说明一些数据库 buffer pool 的原理并说明一些 index management 的一些优化的地方,比如 defer merge, prefetch 以及 index look aside 等等。