2026-10-28 08:11:48
项目核心介绍与面试要点解析
一、简历项目描述优化项目名称:sqldb - Rust 实现的极简关系型 SQL 数据库项目亮点:
Bitcask 模型:日志追加写入 + 内存索引(哈希表存储 key 到文件偏移量的映射)。
持久化机制:写入时先落盘日志文件,定期合并 SSTable 减少碎片。
事务修改数据前写入 WAL(Write-Ahead Log),崩溃时通过重放日志恢复。
提交时标记事务状态为 Committed,Rollback 时清理中间数据。
快照隔离(SI):事务启动时获取全局版本号,读取仅可见已提交且版本号 ≤ 当前事务版本的数据。
冲突检测:写操作检查目标 key 的最新版本是否被其他事务修改,冲突时回滚后发事务。
逻辑优化:谓词下推、列余雹裁剪、JOIN 重排序。
物理优化:选择索引扫描或全表扫描,生成可执行节点树。
使用 Precedence Climbing 算法处理运算符优先级,例如:
// 递归解析表达式fn parse_expr(tokens: &[Token], min_prec: u8) -> Expr { let mut left = parse_primary(tokens); while let Some(op) = peek_operator(tokens) { if op.precedence() < min_prec { break; } let right = parse_expr(tokens, op.precedence() + 1); left = Expr::BinaryOp { op, left: Box::new(left), right: Box::new(right) }; } left}执行时维护哈希表(分组键 → 聚合值),例如 SUM 累加、AVG 计算均值。
支持 GROUP BY 时按分组键分区数据,并行计算聚合结果。
结构:HashMap<Key, RowId>,适用于等值查询(如 WHERE id = 1)。
维护:插入/更新时同步更新索引,删除时标记为逻辑删除(避免频繁重组)。
支持复合索引(多列组合)和覆盖索引(查询字段包含在索引中)。
生产级可引入 B+ 树索引支持范围查询。
查询缓存:缓存频繁执行的 SQL 及其结果。
并行查询:分区表数据后并行扫描和聚合。
主从复制:基于 WAL 同步数据到备库,故障时自动切换。
分布式事务:引入 Paxos/Raft 协议保证跨节点一致性。
SQL 注入防护:参数化查询解析。
审计日志:记录所有 DDL/DML 操作。
管理工具:提供 sqldb-admin 命令行工具支持备份/恢复。
监控:集成 Prometheus 暴露性能指标(如 QPS、延迟)。
回答技巧:结合具体代码片段(如事务提交逻辑、索引查找)说明实现细节,避免泛泛而谈。例如:“在实现快照隔离时,我们通过 Rc<RefCell<VersionChain>> 管理数据版本链,确保读操作不阻塞写操作。”