存储引擎与索引演进

共 20 题
#

1. LSM-Tree 与 B-Tree 的存储模型差异,写放大、读放大、空间放大的工程取舍与典型引擎(RocksDB vs InnoDB)?

A LSM-Tree 写放大低、读放大高,B-Tree 写放大高、读放大低 ✓ 正确答案
B LSM-Tree 读放大低、写放大高
C 两种结构的写放大和读放大完全相同
D RocksDB 使用 B-Tree,InnoDB 使用 LSM
#

2. LSM 合并策略,Tiered vs Leveled Compaction 的读写放大与延迟稳定性?

A 两者在所有指标上完全相同
B Tiered 读放大低、写放大高
C Leveled 写放大低、读放大高
D Tiered 写放大低、读放大高;Leveled 读放大低、写放大高 ✓ 正确答案
#

3. Buffer Pool 与页管理,LRU/Clock 淘汰、脏页刷盘与 checkpoint 如何共同影响读写放大与崩溃恢复?

A 每次写事务都必须立即把脏页刷到磁盘
B checkpoint 越频繁崩溃恢复越慢
C LRU 淘汰与脏页刷盘无关
D checkpoint 推进日志回收点,崩溃恢复从 checkpoint 的 LSN 开始重放 redo,三者在命中率、写放大与恢复时间间权衡 ✓ 正确答案
#

4. B+Tree 的页分裂/合并与写放大,与 LSM 相比,B+Tree 为什么读放大低但随机写放大高,定量如何比较?

A B+Tree 点查读放大低(约等于树高),随机写放大高;LSM 写放大低、读放大高 ✓ 正确答案
B B+Tree 写放大低、读放大高
C LSM 读放大低、写放大高
D B+Tree 与 LSM 的放大特性完全相同
#

5. RocksDB 的 MemTable/WriteBuffer 与 WAL 的写入路径(组提交、批量写)

A 写入先进入 MemTable 并追加 WAL,组提交和批量写通过合并多个写请求的 fsync 提升吞吐 ✓ 正确答案
B 写请求直接写 SSTable,不需要 WAL
C 每次写请求都独立 fsync 一次,吞吐最高
D MemTable 只用于读,不参与写入
#

6. 存储引擎的闩锁(latch)与事务锁(lock)有何本质区别?B+Tree 页访问为什么需要 latch,而 LSM 的并发模型有何不同?

A LSM 的 SSTable 是可变的,需要长期 latch
B latch 与 lock 完全等价
C B+Tree 不需要 latch 也能安全并发
D latch 短持有保护物理结构、无死锁检测;lock 长持有保护逻辑一致性、有死锁检测,B+Tree 访问页用 latch,LSM 用不可变文件+版本化规避 ✓ 正确答案
#

7. SSTable 结构、Block Cache、Filter Block(Bloom Filter)的协同设计与性能影响?

A Bloom Filter 让不存在的 key 直接跳过文件,Index 定位块,Block Cache 复用已读块,共同降低读放大与 IO ✓ 正确答案
B Bloom Filter 会增大读放大
C Block Cache 与 Bloom Filter 无关
D SSTable 不含 Index 块,无法定位
#

8. 列式存储(Columnar Storage)的压缩(Run-Length/Dictionary/Delta)与向量化执行契合度?

A 压缩会破坏向量化执行
B 压缩后的数据必须完全解压成行式才能计算
C 列存数据离散,不适合 RLE 压缩
D 列存按列连续存储,RLE/字典/Delta 压缩降低数据量,且可在编码域直接向量化,契合度高 ✓ 正确答案
#

9. Undo Log 与 Redo Log 的分工,MVCC 版本链与崩溃恢复(WAL)分别依赖哪种日志,为什么 Redo 是物理、Undo 是逻辑?

A Undo 用于崩溃恢复,Redo 用于回滚
B Redo 物理记录页变更用于崩溃重放,Undo 逻辑记录撤销操作用于回滚与 MVCC 版本链 ✓ 正确答案
C Redo 是逻辑的,Undo 是物理的
D MVCC 版本链依赖 Redo
#

10. 自适应哈希索引(AHI)与 Bloom Filter 在加速点查时的边界,为什么 AHI 有内存与维护开销、命中率不稳定?

A AHI 与 Bloom Filter 都只适用于写密集场景
B AHI 无内存开销,命中率永远稳定
C Bloom Filter 会误判 key 存在,导致读放大明显增大
D AHI 用内存+维护成本换热点点查命中,命中率依赖访问模式;Bloom Filter 用少量误判换规避无效读盘 ✓ 正确答案
#

11. 存储层压缩,Page 级压缩、前缀压缩与字典编码在列存/行存的成本收益,压缩与随机更新的矛盾如何解决?

A 压缩后无法原地定位修改,需解压改完再重压缩,可用日志式/追加式更新或冷热分层缓解 ✓ 正确答案
B 压缩与随机更新完全兼容,无需处理
C 行存比列存更利于压缩
D 字典编码只适用于高基数列
#

12. InnoDB 的索引组织表,聚簇索引与二级索引的回表?

A 回表一定会降低性能但无法避免
B 二级索引叶子直接存整行,无需回表
C 聚簇索引只能一个,二级索引也只有一个
D 聚簇索引叶子存整行,二级索引叶子存索引列+主键,二级索引查询需回表取整行,覆盖索引可避免回表 ✓ 正确答案
#

13. 数据库页大小与 IO 对齐(4K/8K/16K)对读写性能的影响

A 页大小与 IO 对齐无关
B 页大小需与磁盘/文件系统块对齐,大页利于顺序吞吐与缓存率,小页利于随机点查精度与缓存粒度 ✓ 正确答案
C 页越大随机点查越高效
D 页越小顺序扫描吞吐越高
#

14. 崩溃恢复如何利用 checkpoint 确定重放起点?redo 从哪个 LSN 开始、undo 如何回滚未提交事务?

A redo 必须从头重放全部日志
B redo 从 checkpoint 记录的 LSN 开始重放已提交修改,未提交事务依据 undo log 回滚 ✓ 正确答案
C checkpoint 记录了内存数据的全部内容,无需重放
D 未提交事务的修改不需要回滚
#

15. Bw-Tree、HOT 等新型索引结构分别针对 B+Tree 的什么问题(无锁并发、缓存友好、写放大)?工程落地为何有限?

A 新型索引已完全取代 B+Tree
B Bw-Tree 用无锁+delta 更新针对并发,HOT 针对写放大/缓存,但实现复杂且与恢复/事务集成难,落地有限 ✓ 正确答案
C Bw-Tree 针对读放大而非并发
D HOT 只针对内存容量,不涉及写放大
#

16. 学习型索引(Learned Index, The Case for Learned Index Structure)的工程进展与适用范围?

A 学习型索引不需要误差上界保证
B 学习型索引可完全替代 B+Tree 且支持高并发更新
C 用模型学习 key 到位置的映射,需保证误差有界,适合静态只读数据,生产落地有限 ✓ 正确答案
D 学习型索引只适用于动态更新场景
#

17. 新硬件对存储引擎的挑战,NVMe SSD 与持久内存(PMEM)如何改变页缓存与 fsync 的工程假设?

A SSD 仍需严格顺序写才能高效
B NVMe 与 PMEM 对存储引擎设计没有影响
C PMEM 无需任何持久化屏障
D NVMe 缩小随机与顺序 IO 差距、PMEM 提供字节寻址持久化,都改变了页缓存与 WAL/fsync 的旧假设 ✓ 正确答案
#

18. 内存数据库索引,Hash 索引与跳表的应用?

A 跳表不支持并发
B Hash 索引支持范围查询
C Hash 索引等值点查 O(1) 但无序,跳表支持有序遍历与范围查询 O(log n),按查询形态选择 ✓ 正确答案
D 内存数据库只能使用 Hash 索引
#

19. 对象存储作为数据库存储层的挑战(延迟、写入放大)与混合存储方案

A 混合存储无法解决对象存储的写放大问题
B 对象存储支持细粒度随机写,适合作为热存储层
C 对象存储延迟极低,适合热路径
D 对象存储高延迟、按对象不可变导致写放大,混合方案用热数据本地+冷数据对象存储缓解 ✓ 正确答案
#

20. 页内的行与记录如何布局(插槽数组、碎片)?页内碎片整理与合并对更新密集负载的影响是什么?

A 碎片整理对用户总是无感知的,应频繁执行
B 槽数组使记录无法移动
C 页内用槽数组+数据区使记录可移动,碎片整理与页合并提高空间利用率但会带来 CPU/IO 与并发开销 ✓ 正确答案
D 页合并与页内布局无关