深色模式
数据库基础、索引与事务
面向全栈岗位的语言无关基础。先口述定义与场景,再解释一致性、性能和故障边界;产品特有行为会明确标注。
1. 关系型数据库与非关系型数据库如何选型?
展开答案与追问
参考答案: 先分析数据关系、查询方式、一致性、写入规模和团队运维能力。关系型数据库适合关系约束、事务和组合查询;文档、键值、搜索等存储面向不同访问模式。一个业务可以组合使用,但每增加一种存储都会增加同步和运维成本。
追问与易错点: 不要用“SQL 一定慢、NoSQL 一定无事务”概括产品。
2. 主键、唯一约束与外键分别解决什么?
展开答案与追问
参考答案: 主键标识记录并要求唯一且非空;唯一约束表达业务唯一性;外键维护引用完整性。应用检查可改善报错体验,但并发下最终约束应由数据库或等价一致性机制保证。
追问与易错点: 唯一约束对 NULL 的处理因产品与配置而异,不能默认所有数据库相同。
3. 范式与反范式如何取舍?
展开答案与追问
参考答案: 规范化减少重复和更新异常;反范式将可接受的冗余引入读模型,换取更少关联和更快查询。先保持业务事实的清晰来源,再为有证据的热点设计冗余,并定义更新、重建和校验流程。
追问与易错点: 例如订单保存成交时商品名称与价格快照,这既是查询需求,也保留历史业务事实。
4. B+ 树索引为什么适合数据库?
展开答案与追问
参考答案: 多路平衡结构降低树高和页访问次数,叶子按键排序,适合范围和有序访问。相比之下哈希结构通常更偏向等值查找。具体产品可能使用 B-tree 家族的不同实现。
追问与易错点: 不要声称所有主键都聚簇或所有辅助索引都存主键;这属于具体引擎差异。
5. 联合索引的列顺序怎么设计?
展开答案与追问
参考答案: 结合常用过滤、等值与范围条件、排序和覆盖需求选择顺序。前导列通常影响可利用的扫描范围,但优化器也可能采用跳跃扫描等路径。必须结合数据分布和执行计划验证。
追问与易错点: 不把“最左前缀”说成任何数据库、任何情况都绝对不能使用非前导列。联合索引
6. 索引越多越好吗?什么情况下不会用索引?
展开答案与追问
参考答案: 索引增加写入、空间和维护成本。返回比例太大、统计信息失真、表达式或类型转换不匹配等,都可能让优化器选择其他路径。是否使用索引由成本和可用访问路径决定。
追问与易错点: 小表或大量行查询时顺序扫描可能更划算;不要把未使用索引直接判定为错误。
7. 如何定位慢 SQL?
展开答案与追问
参考答案: 先获取实际语句、参数、耗时与调用量,再看执行计划的估算/实际行数、扫描、连接、排序和临时空间;同时排查锁等待、I/O 与连接池。优化后在相同数据分布下验证。
追问与易错点: EXPLAIN ANALYZE 通常实际执行语句,写操作需要隔离环境与副作用评估。执行计划
8. ACID 分别是什么?
展开答案与追问
参考答案: 原子性要求事务整体成功或撤销;一致性关注事务前后满足业务和数据约束;隔离性定义并发事务之间的可见和相互影响;持久性关乎提交结果在约定故障模型下保留。
追问与易错点: ACID 的一致性不等同于分布式系统中线性一致性;数据库无法替你定义所有业务规则。
9. 四种隔离级别与常见异常如何理解?
展开答案与追问
参考答案: 标准隔离级别从读未提交、读已提交、可重复读到可串行化逐步增强约束。脏读是读到未提交数据,不可重复读关注同一行前后变化,幻读关注查询结果集合变化;还需关注丢失更新和写偏斜。
追问与易错点: 同名级别在不同数据库的实现不完全相同;快照隔离不自动等于可串行化。隔离说明
10. MVCC 为什么能减少读写冲突?
展开答案与追问
参考答案: 通过保留版本和可见性规则,让读取者在合适快照上读取,而非每次都等写入完成。写写冲突、锁与约束仍需处理,旧版本还需回收。长事务可能妨碍回收并放大资源占用。
追问与易错点: MVCC 不等于“完全无锁”,版本存放及回收方式因引擎而异。
11. 悲观锁与乐观并发控制如何选择?
展开答案与追问
参考答案: 悲观方式先通过锁协调竞争;乐观方式在提交时使用版本号或条件更新检测冲突。低冲突可减少持锁等待,高冲突则需考虑失败重试成本。两者都必须围绕具体业务不变量设计。
追问与易错点: 条件更新示例:UPDATE items SET stock = stock - 1 WHERE id = ? AND stock > 0;检查影响行数,而不是先查再无条件写。
12. 死锁如何处理?
展开答案与追问
参考答案: 多个事务形成循环等待时会死锁。通过统一锁顺序、缩短事务、减少锁范围降低概率;数据库通常检测并中止其中一个事务,应用需在允许范围内重试整个事务。
追问与易错点: 单纯提高超时不能消除死锁;重试需要考虑事务外已经产生的副作用。
13. 深分页和游标分页有什么区别?
展开答案与追问
参考答案: OFFSET 大时可能扫描并跳过大量记录;游标分页以稳定排序字段和唯一决胜字段定位下一页,适合连续翻页。它不天然支持任意跳页,也需要处理排序字段变化和快照语义。
追问与易错点: 按 created_at、id 组合排序,用相同组合建立续页条件,不能仅依赖可能重复的时间戳。
14. 主从复制、读写分离有哪些一致性问题?
展开答案与追问
参考答案: 异步复制允许副本落后,写后立刻读副本可能看不到结果。可通过关键请求读主、版本/位点等待或会话路由满足要求,但会增加复杂度。故障切换也需考虑数据损失窗口与旧主写入。
追问与易错点: 读写分离主要分摊读取,不自动解决单点写瓶颈和跨分片事务。
15. 备份、复制与分库分表分别解决什么?
展开答案与追问
参考答案: 备份提供按恢复点找回数据的能力,复制服务于冗余和读扩展,分片用于拆分容量或负载。误删可能被复制,因此复制不能替代备份。分片会使唯一约束、关联、迁移和热点处理变难。
追问与易错点: 先定义 RPO/RTO 并演练恢复;在单库索引、查询与容量优化后再评估分片。