这里应该会记录单机数据库内核开发的相关面经。

你是怎么实现 LRU 的,实现过程中大概用了什么数据结构?

什么时候对内存中的帧 frame bitmap - 1 操作,也就是 unpin?

实现 B+ 树索引用到了什么数据结构,你能简单说说吗?

如何从 B+ 树中删除一个节点,并保证树的平衡。

什么是 Executor 火山模型,结合 Select 说说?

你能说说怎么实现 Nested Loop Join,Hash Join 的?

看你提到了死锁避免算法,那你说说什么是死锁?

BufferPool 中脏数据如何写入(flush)磁盘?

什么场景下使用 B+ 树更适合?

B+ 树的优缺点是什么?

介绍一下 Executor 火山模型?有什么优缺点?如何改进?(优化算子树、改用 Pipeline 模型)

介绍一下 Pipeline 模型?为什么相比火山模型更快?(可以跑满 CPU 流水线)

你知道 Pipeline 有哪些具体的应用吗?(Doris 和 Tiflash)

Tiflash 是函数下推,为什么要函数下推?(列式向量计算、让计算和存储更接近)

介绍一下 Hash Join 是怎么实现的?

  • 追问:有没有考虑过 Hash 对 id/key 进行散列后得到的值很分散,那么得到的 Hash Table 很大,内存占用会很大?你的测试数据集规模有多大,有做过压测吗?查看实际的内存占用。
  • 回答:换用其它 Hash 函数,被面试官说并不是 Hash 函数的问题。

你知道死锁出现的 4 个前提条件吗?

  • 回答:互斥条件、请求和保持条件、不可剥夺条件、循环和等待条件

你是如何使用 Wound-Wait 算法预防死锁的?

  • 回答的核心是:不要让线程一直等待,如果一直等待则需要根据 Wound-Wait 算法 Kill 掉相关线程。
  • 老读不杀新读,老读杀新写,老写通杀。

为什么要用 B+ 树而不用其它的树如红黑树?B+ 树有什么优势?

如何实现三种隔离级别?(RU、RC、RR)

什么是幻读?

加锁避免幻读的时候是单行加锁还是多行加锁?

什么是死锁?你是如何实现全局的 Lock Manager 管理 R/W 锁,如何使用 Wound-Wait 算法避免死锁的?

Wound-Wait 算法避免死锁时如何避免某些线程饥饿状态,即某些线程经常性的被 Kill?

MySQL 是因为什么才能支持索引的最左前缀

  • B+ 树

MySQL 建表要考虑什么情况,以及什么时候会出现索引失效