简单题。基本上在数据库内容的面试中,这是一个必问题目。换一句话来说,绝大部分人都能回答出来这个问题,所以你更加要想办法刷出亮点,引导面试官追问。
而要想回答好这个问题也很简单,就是要点出页和页分裂的问题。并进一步从页和页分裂的角度总结自增主键的优点,而后要尝试将话题引入到分库分本表中。
略难的题,高频面试题。难点主要在于 MVCC 本身内容很多,很难全部记住,而且从 MVCC 衍生出来的内容也太多,问法多样,初学者很容易栽在这里。
这个问题一般是深入面 MVCC 的开场白,所以你在回答的时候只需要把关键点点出来,留下引导就可以了,具体细节可以等面试官追问的时候再说。
简单的题,支持。
这个问题有一个小陷进,就是虽然 MySQL 虽然事实上实现了快照读的效果,但是它并没有称为快照读,而是依旧是说可重复读。因此你在回答的时候要指出这一点,防止面试官抬杠。
略难的题,难在理解并记住。
在回答这个问题的时候,一定要紧密结合 MVCC 和隔离级别来讨论。
难题,能够问出这个问题的面试官对 MYSQL 应该是非常熟悉的。
大部分时候时候,网上(包括我)在说已提交读的 Read View 生成时机的时候,都会说每一次执行 SQL 就会生成 Read View,这种说法是不准确的,或者说是简化之后的,准确说法是非一致性锁定读的时候,才会生成 Read View。
难题,这个问题需要对 Read View 有很深的理解才能问出来,当然也才能回答出来。
略难,出题可能性比较高的题目,一般在考察 MVCC 的时候都大概率问到。
回答这个问题,就要和版本链,Read View 联动,同时要注意延伸扩展到其它中间件所声称的事务上。也就是记住这个结论:但凡一个中间件声称自己支持事务,但是又没有类似 undo log 和 redo log 的机制,你就可以认为,它们支持事务,但是不支持 ACID 的事务。
略难的题。你如果第一次听到这个题目你都可能觉得很懵逼,毕竟从直觉上来说删除一条数据,就是直接从磁盘上删除数据。而实际上,它考察的关键点是延迟删除。
所以在回答这个问题的时候,一个是要清楚说清楚步骤,而后则是要将话题引导到 undo log、碎片整理上。此外,如果你能够解释清楚为什么搞这种标记-延迟删除的做法,就更加出彩了,毕竟大多数候选人最多回答到延迟删除的特性,你回答之后的赢面还是很大的。
简单的题,高频的题。一般这个问题会作为深入考察锁机制的开场白。正如之前你看到的大部分宽泛的问题,你在回答的时候,要点在于尽可能说出关键字,而后等待面试官追问。
你刷亮点落在:提及索引与表锁的问题,提及乐观锁以及已提交读下使用更少的锁。当然这也是一种引导,而后你就可以深入讨论这几个问题,打出组合拳。
略难的题。难度源自两方面,一个是三个概念本身其实在实践中很少用得上,容易混淆并且还有一个垃圾译名临键锁;另外一方面是这三者的加锁时机真的一时半会讲不清楚。
这里有一个值得在面试中提起的点,就是 MYSQL 记住临键锁在可重复读这个隔离级别下解决了幻读的问题。除此以外,我认为这个题目的性价比比较低,所以你只需要回答出来它们三个的基本定义,而具体地什么时候加什么锁,你有闲情逸致的时候再慢慢学习。
简单题。这个题目就是考察一个问题,也就是如果实在查询没有命中任何索引的时候,就会使用表锁。
当然,除了这个考点以外,还有一些其他的原因,你要是记得也可以顺便提出来。而后你可以提一下自己优化过表锁,从而将话题引导过去怎么优化查询上。
简单的题,你记住关键点锁是利用索引来实现的就可以了。
但是如果你要是能够站在设计者的角度解释为什么做成这样的设计,并且明确指出归根结底是依赖聚簇索引来实现的,就可以刷出亮点。
简单题,利用的是临键锁。
在这道题下,你可以深入讨论临键锁究竟是怎么解决幻读的,并且结合加锁的实际情况指出有些时候可能是间隙锁解决了幻读。而后将话题引导到快照读上。并且还可以稍微提一下在互联网应用里面,其实并不怎么使用可重复读这个隔离级别。
简单的题,也比较常问。redo log 要背的内容明显要比 undo log 少,所以要简单一些。
redo log 这边刷亮点要着落在讨论 redo log 这种 WAL 机制在不同中间件中的应用,而后进一步指出 redo log 的刷盘时机会对事务的最终效果有影响。
难题。准确说,如果你从来没有听过类似的题目,那么你大概率会寄了。但是如果你听过,你就肯定能够回答出来。
这个问题的关键点就是 redo log 的刷盘实际的问题,但是大部分人都不会去调整这个参数,所以很少有人遇到过。而你要想刷出亮点来,你就可以进一步延伸到所有中间件,以及所有分布式中间件都要面临的“写入”语义问题,这个是你要重点掌握的。
难题。
很少有面试官会问这个问题,但是这个问题很重要,贯穿在大部分中间件的面试中。比如说讨论 MySQL 事务提交,Kafka 消息丢失等问题都会涉及到分布式环境下的写入语义问题。
所以你千万要记住这里讨论的问题,一旦你发现面试官问“数据会不会丢”,“写入到了哪里”你就用这部分内容来回答,保证可以刷出亮点。
简单题,较为常面。
这个问题有一个很好的引导点,就是将话题引导过去分库分表的分页查询中。因为深度分页这个问题在分库分表里面遇到的性能问题更加严重,但是解决思路反而是类似的。