SDET / SWE · Technical Fundamentals

TikTok B+Tree:页扇出、叶层顺序与范围扫描

解释内部导航和叶层条目,推导页访问规模及分裂/合并取舍。

题目重点:解释内部导航和叶层条目,推导页访问规模及分裂/合并取舍。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 讨论传统B+树抽象,具体数据库可能有并发、MVCC和页链接扩展;叶项不一定是完整数据行。

解题路线

  1. 内部节点保存分隔键和孩子页指针用于导航,叶层保存键与记录定位或数据入口;叶层常按键序链接,支持连续范围扫描。数据如何聚簇由表组织决定。
  2. 高扇出来自一页放多个键/指针,树高约log_B N;磁盘/缓存单位是页,因此相比二叉指针树少很多随机页访问,而非只是CPU二分更快。
  3. 定位范围起点后沿叶层扫描直到上界,不需对每个key重新从root查找;扫描成本包含命中叶页和最终数据页,非聚簇回表可能仍散乱。
  4. 插入定位叶页,满页需分裂并向上插分隔键,极端可长出新root;删除需维护占用率/分隔键,可能借键或合并。保持有界高度会带来额外写和锁。
  5. 键越宽、指针和记录入口越多,实际扇出越小,缓存密度也下降。使用随机主键或顺序key的页热点/分裂行为不同,不能只用渐近界判断写性能。
  6. B树和B+树不是所有实现固定同一布局;面试先讲抽象差别,再问实际存储类型。不要把“叶子含记录”误说所有数据库叶页必含整行。

手动走一遍

若页扇出大约100,百万入口的导航层数只有少数层;范围1000项在定位一次后顺序扫描多页,比1000次独立查找更省导航,但回表成本仍看物理布局。

规模与取舍

查找O(log_B N)页访问;范围k项约导航加O(k/每页条目数)索引页访问及回表。空间O(N),更新存在分裂向上传播和日志写成本。

易错点与追问

容易失分的边界

  • 叶项一定整行。
  • 只计树高不计回表。
  • 所有页永不分裂。

继续深挖

  • 聚簇与非聚簇叶入口有什么区别?
  • 键宽为何影响缓存?
  • 并发分裂怎样让读者仍找到正确页?
✓已复制微信号!