ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

2023小满秋招数据库笔试复盘:核心考点与实战避坑指南

2023小满秋招数据库笔试复盘:核心考点与实战避坑指南 2023年度小满秋招数据库岗第二批笔试复盘秋招季又一次走到数据库岗位的笔试环节小满这家公司的第二批笔试刚刚结束。结合我这几年的面试和辅导经验以及这次考生们反馈回来的题目细节我来把这一批笔试的考点、思路和实战技巧系统梳理一遍。无论你是正在准备校招还是想转行做数据库方向这篇文章都能帮你少走一些弯路。先说下这批笔试的整体印象题目覆盖面很广从SQL基础语法、事务隔离级别、索引底层原理到数据库设计规范、常见故障排查都有涉及。难度上比第一批略有提升尤其是在场景题和综合题上更考验对数据库底层机制的理解深度而不是单纯背概念。1. 整体考点分布与应对思路1.1 题型结构与分值分布这批笔试总共六大题满分100分考试时间120分钟。从题型结构来看出题人明显想筛选出真正理解数据库原理、而不只是会写增删改查的候选人。单选题10题每题2分考察基础概念覆盖事务ACID、索引类型、范式理论、锁机制等多选题5题每题3分容易失分的区域多选错选均不得分填空题10空每空1分考察关键术语和参数记忆SQL编写题3题共25分考察多表联查、子查询、窗口函数简答题2题共15分考察事务隔离级别和索引失效场景综合设计题1题20分设计电商订单系统的数据库表结构并说明设计理由这个结构很有意思基础题占比约40%中高难度题占比约60%。和往年相比SQL编写题的分值略有下降但综合设计题从15分涨到了20分释放了一个信号企业越来越看重候选人的架构设计能力。1.2 出题趋势背后的人才需求从出题方向能看出小满这类中型互联网公司对数据库岗位的期望不只是会写SQL跑通业务更希望候选人具备三方面的能力第一是底层原理的理解能力。比如索引为什么用B树而不是红黑树MySQL InnoDB为什么默认使用可重复读隔离级别这些问题背后都有深层的设计考量。如果只停留在会用的层面很难答好。第二是问题排查的实战能力。笔试里出现了不少类似SQL执行突然变慢如何排查的题目这类问题没有标准答案考察的是候选人有没有真正处理过线上问题。第三是方案设计的前瞻性。综合设计题要求设计订单系统表结构并且要考虑后续的扩展需求这已经超出了单纯建表的范畴需要具备一定的架构思维。有备考的同学问我应该如何分配复习精力。如果按投入产出比排序我建议SQL编写题优先因为这是最容易通过刷题拿分的地方其次是索引和事务相关的原理题这部分重在理解最后是简单题和填空题靠日常积累就能应对。2. 核心考点深入解析2.1 事务隔离级别必考且容易混淆这批笔试题中有两道关于事务隔离级别的题目一道单选一道简答加起来占了7分。根据考生的反馈失分的主要原因不是不知道四种隔离级别而是分不清每种级别解决了什么问题、还存在什么问题。数据库的四种隔离级别从低到高依次是读未提交、读已提交、可重复读和串行化。这里有个记忆技巧隔离级别越高并发性能越低数据一致性越强。它们分别解决的问题对照如下隔离级别脏读不可重复读幻读读未提交可能可能可能读已提交防止可能可能可重复读防止防止可能InnoDB已解决串行化防止防止防止这里有一个容易忽略的知识点MySQL的InnoDB引擎在可重复读隔离级别下通过间隙锁机制已经解决了幻读问题。但Oracle默认使用读已提交而且Oracle没有可重复读这个级别只有读已提交和串行化。很多考生在答题时默认所有数据库的行为一致这是典型的思维定式坑。在解释为什么MySQL选择可重复读作为默认隔离级别时可以从主从复制角度切入。binlog在statement格式下记录的是SQL语句如果使用读已提交可能出现主库执行顺序和从库回放顺序不一致的问题而可重复读配合间隙锁能规避这个风险。这个知识点如果能在简答题中答出来会是不错的加分项。2.2 索引原理与失效场景SQL编写题之外索引相关考点是出题人的最爱。填空、选择、简答都有涉及而且这批的索引题比第一批更细开始考察联合索引的最左前缀原则在不同查询条件下的表现。关于索引底层数据结构B树之所以成为主流数据库的默认选择是因为它相比B树有两个关键优化只在叶子节点存储数据非叶子节点可以存储更多索引项树的高度更低叶子节点通过双向链表相连范围查询时不需要回溯到父节点直接沿链表遍历即可。这样设计的好处在千万级数据量的表上做范围查询时体现得特别明显。联合索引的创建和使用是实操中非常容易踩坑的地方。比如对(a, b, c)三列创建联合索引查询条件是where a 1 and c 3时只有a能用到索引c无法使用。但如果查询条件是where a 1 and b between 2 and 3 and c 4呢MySQL 8.0引入了索引跳跃扫描优化在某些条件下可以让c条件也走索引但这需要满足特定条件不能指望所有版本都支持。索引失效的场景几乎是每场笔试必考。列举几个高频失效场景对索引列使用函数或计算如WHERE DATE(create_time) 2023-05-01使用LIKE前置通配符如WHERE name LIKE %张隐式类型转换如WHERE phone 18812345678phone为varchar类型OR条件连接非索引列这里最坑的是隐式类型转换很多人在实际工作中都没意识到。比如phone字段是varchar类型查询时直接写WHERE phone 18812345678MySQL会自动将字符串转为数字导致索引失效。解决方法是写SQL时养成好习惯字符串常量加引号数字常量不加引号保持两侧类型一致。2.3 锁机制从概念到实战这批笔试考了一道行锁和表锁的选择题以及一道关于死锁的死锁判断题。锁是数据库并发控制的核心机制也是很多候选人觉得抽象难懂的部分。简单理解锁机制就是数据库用来协调多个事务同时操作同一份数据的规则。就好比一个房间同时只能进一个人其他人要等里面的人出来才能进去。数据库的锁也是类似的道理只不过粒度更细、规则更复杂。InnoDB支持行级锁和表级锁行锁又分为共享锁S锁和排他锁X锁。共享锁之间可以兼容排他锁和任何锁都不兼容。这个兼容关系可以用一句话概括读读不互斥读写互斥写写互斥。关于死锁笔试考了一道分析题事务A先锁行1再锁行2事务B先锁行2再锁行1此时两个事务互相等待对方释放锁形成死锁。InnoDB检测到死锁后会回滚持有锁较少的事务。备考时可以记住一个排查技巧通过SHOW ENGINE INNODB STATUS命令查看最近一次死锁信息重点关注LATEST DETECTED DEADLOCK部分它会显示两个事务分别持有哪些锁、等待哪些锁。2.4 SQL编写题多表联查与窗口函数SQL编写题占了25分是这批笔试中分值最大的部分。3道题目分别考察多表联查、子查询和窗口函数。从考生反馈来看窗口函数的题目是主要失分点。窗口函数相比GROUP BY的优势在于它能在不改变行数的情况下对数据进行分组计算。比如查每个部门薪资排名前3的员工如果用GROUP BY很难写但用窗口函数ROW_NUMBER() OVER(PARTITION BY dept_id ORDER BY salary DESC)就非常简洁。这道题基本是窗口函数题的经典考法建议备考时把ROW_NUMBER、RANK、DENSE_RANK的区别搞清楚笔试很喜欢考这三个的差异点。再分享一个SQL编写的小技巧遇到多表联查的题目先画出表之间的关系确定主表和关联表再考虑过滤条件应该放在WHERE还是ON中。对于INNER JOIN放在哪里都一样但对于LEFT JOIN条件放WHERE会把左连接变成内连接效果这个坑很多人踩过。我在面试候选人时经常发现一个问题只要涉及到三张表以上的联查很多人就开始晕。其实思路很简单先两两关联把结果当成一张临时表再和第三张表关联一步一步来不容易出错。3. 数据库设计综合题实战演练3.1 题目还原与需求拆解这批笔试的压轴题是设计一个电商订单系统的核心表结构。要求至少包含用户表、商品表、订单表、订单明细表并说明主键设计、索引设计和分表策略。这类题目没有标准答案考察的是候选人的设计思路是否清晰、是否考虑到了实际业务中的复杂情况。拿到题目后我的建议是先拆解需求不要急着建表。电商订单系统涉及的核心实体有用户、商品、订单、订单明细。它们之间的关系是一个用户有多张订单一张订单包含多条订单明细一条订单明细对应一个商品。除此之外还要考虑订单状态流转、收货地址快照、商品库存扣减等业务逻辑。3.2 具体表结构设计在设计订单表时有一个容易忽略的点订单金额必须冗余存储在订单表中而不是通过明细表汇总得出。原因很简单商品价格可能变动如果用户下单后商家改价订单明细里的价格应该保持下单时的快照而不是实时去查商品表。订单号的设计也值得展开。使用自增ID做主键虽然简单但在电商场景下有明显的缺点订单号可被猜测容易暴露平台销量大促期间高并发写入时自增ID会成为性能瓶颈。很多电商系统会使用雪花算法生成分布式ID既保证全局唯一又能满足高并发需求。笔试答题时如果能提到这一点会比直接说用自增ID好很多。订单表核心字段建议覆盖以下几个方面订单号、用户ID、订单状态、订单总金额、支付方式、收货人快照、收货地址快照、创建时间、支付时间、发货时间、完成时间。索引设计的核心原则是区分查询场景。用户查自己的订单列表需要user_id create_time的联合索引运营后台查某时间段的订单需要create_time单列索引或者状态相关索引。订单状态最好建一个普通索引因为按照状态筛选是订单管理的常见操作。订单明细表的建表思路略有不同主键用自增ID没问题但order_id上必须建索引因为查询某个订单的明细是最频繁的操作。加上商品ID索引可以支持查看某个商品的历史销售记录。3.3 分表策略与扩展性考虑当订单量达到千万级别时单表已经无法支撑需要考虑分库分表。常用的分表策略是订单号取模或按用户ID分表。按用户ID分表的优势在于同一用户的订单数据集中在同一张表中查询用户订单列表只需要查一张表避免了跨表聚合。缺陷是可能产生数据倾斜大用户和小用户的表数据量差异很大。按订单号取模分表的优势在于数据分布均匀但查某个用户的订单时需要从所有分表中查询再汇总跨表查询的开销较大。回答这道题时要注意体现自己的取舍思考。比如可以说从我们的业务场景出发用户查询自己订单的频率远高于运营后台的查询频率所以优先考虑按用户ID分表等到订单量继续增长再引入订单号路由维度配合数据同步工具做异构数据查询。4. 高频失分点与避坑指南4.1 概念混淆是最大失分来源根据多位考生的复盘反馈这批笔试失分最严重的不是不会写SQL而是概念之间的混淆。尤其是以下几组概念的区分建议重点记忆。第一组是主键、唯一键和普通索引的区别。主键和唯一键都要求列值唯一但主键不允许NULL一个表只能有一个主键唯一键允许NULL一个表可以有多个唯一键。普通索引则允许重复值只是提高查询效率。第二组是聚簇索引和非聚簇索引的区别。InnoDB的聚簇索引就是主键索引叶子节点直接保存整行数据非聚簇索引的叶子节点保存的是主键值需要二次回表查询。如果查询的列恰好都在非聚簇索引中就能通过覆盖索引避免回表这也是优化SQL的重要手段。第三组是SQL的DELETE和TRUNCATE的区别。DELETE是DML操作逐行删除可以带WHERE条件可以回滚删除后自增ID不会重置TRUNCATE是DDL操作清空整表且不能回滚自增ID会重置。很多人把这两者混在一起答简单题白丢分很可惜。4.2 SQL编写中常见的细节错误SQL题的思路对了但因为细节错误扣分的案例也不在少数。一个高频问题是GROUP BY后面漏写非聚合字段。在MySQL 5.7及更早版本中如果SELECT了不在GROUP BY中且不是聚合函数的字段不会报错但结果可能不符合预期在MySQL 8.0中这种写法会直接报错。另一个细节是HAVING和WHERE的使用场景WHERE在分组前过滤HAVING在分组后过滤。对聚合函数的结果做条件筛选只能用HAVING比如查销售额大于10000的商品必须写成HAVING SUM(amount) 10000不能写成WHERE SUM(amount) 10000。还有一个容易被忽略的点是子查询的别名问题。MySQL要求在FROM子查询后面必须加别名否则直接报错比如SELECT * FROM (SELECT * FROM orders) t。这个错误在笔试中遇到过一次排查起来很费时间建议平时写SQL时就养成良好的别名习惯。4.3 死锁场景的判断与分析笔试中死锁题的常见考法是给一段操作序列要求判断是否会死锁以及如何避免。判断死锁的关键是检查是否存在循环等待条件。举一个典型的例子事务A先更新用户表某行的积分字段再更新订单表某行的订单状态事务B先更新订单表同一行的订单状态再更新用户表同一行的积分字段。两个事务按照不同顺序加锁最终必然会死锁。避免死锁的方法可以从加锁顺序入手所有事务都按照用户表再到订单表的顺序加锁就不会形成循环等待。在代码层面尽量保持事务短小、减少锁持有时间也能有效降低死锁概率。4.4 热门数据库难点速查除了MySQL近年来国产数据库和新兴数据库在面试中出现的频率明显上升。虽然这次笔试没有直接考察但在简答题的扩展回答中提到会显得视野更开阔。国产数据库方面达梦数据库、人大金仓、GaussDB等都有考生在准备。它们的共同点是兼容MySQL或Oracle的语法但底层实现各有不同。比如GaussDB在分布式场景下有独特的分区表设计如果面试时能结合具体场景谈国产数据库的选型考量比较加分。向量数据库是近两年的热潮方向主要服务于AI相关的相似度检索场景。如果简历里有相关项目经验建议了解常见向量数据库的基础原理比如HNSW算法的核心思想是分层搜索通过牺牲一定的构建时间换取高效查询。5. 备考素材推荐与经验心得5.1 经典教材与文档如果备考时间充足优先级比较高的几份资料我个人按顺序推荐如下。《高性能MySQL》是MySQL方向的必读书目重点看索引优化、查询优化、复制和备份这几章。这本书信息量非常大建议带着问题去读不要试图一次性全部读透。官方文档是容易被忽视但价值很高的资源。MySQL 8.0官方文档中的InnoDB锁章节和优化器章节内容比很多博客准确详实。读英文文档确实费时间但对面试中的底层原理题目帮助很大。刷题方面力扣数据库题库覆盖了从简单到困难的各种SQL题型尤其是中等难度的题目和校招笔试的SQL题风格非常接近建议优先刷完这部分。5.2 实操练习是理解原理的关键笔试里考察的原理类题目如果只是看书很难真正理解。我建议面试准备阶段自己动手在本地搭一个MySQL实例把事务隔离级别、锁等待、死锁等场景实际跑一遍。之前有备考者按照我的建议用两个终端模拟两个事务并发操作亲手制造了一次死锁再用SHOW ENGINE INNODB STATUS命令查看死锁日志。他反馈说这比看十遍概念都管用看到死锁日志的那一刻理论上的知识一下子串起来了。搭建本地环境的成本很低使用Docker一条命令就能启动MySQL配合官方提供的employees示例数据库就可以做一些基础查询练习。如果遇到启动配置问题官方的安装文档都有详细说明照着步骤来一般不会出大问题。5.3 时间分配与答题策略笔试时间是120分钟时间看起来充足但综合设计题往往需要较长的思考时间很容易出现前松后紧的情况。我建议的时间分配方案是选择题和填空题控制在30分钟内SQL编写题控制在40分钟内简答题20分钟综合设计题留30分钟。综合设计题不要一上来就写SQL先列出涉及的表和核心字段画清楚关系再逐步补充索引和分表策略。遇到不会的题目先跳过做后面的最后再回来思考。选择题即使不确定答案也尽量不要空着选一个最可能的选项。填空题实在想不出来也不要纠结太久一两分钟的犹豫可以接受超过五分钟就需要果断放弃把时间留给后面分值更高的题目。6. 秋招数据库岗笔试的趋势展望从这次笔试的情况来看数据库岗的考察方向正在发生明显变化。过去那种纯背概念、刷题的备考方式越来越难以应付现在的题目了。未来的笔试会更加侧重三个方面。一是场景化设计能力像这次的电商订单系统设计题本质上考察的是候选人能否结合实际业务做合理设计。二是对底层原理的深度理解B树为什么能支撑亿级数据查询、MVCC如何实现读写不互斥这类题目需要真正的理解才能作答。三是故障排查能力数据库出问题时的分析思路和处理流程会越来越成为区分候选人的关键考题。给正在准备秋招的同学一个建议学校教的数据库原理课程很重要但那是地基在这个基础上花时间亲手去做一个完整的数据库项目无论是课程设计还是实习中遇到的实际问题理解深度是完全不同的。面试官问到一个你踩过的坑时你眼睛里是有光的这种状态是任何背诵都无法替代的。我见过太多简历上写着熟悉MySQL、熟悉索引优化的候选人一问到联合索引的具体使用场景就答不上来。如果你正在准备面试不妨自己模拟面试官你对一个表创建了联合索引(a, b, c)哪些场景会走索引哪些不会这个问题能说透至少一多半的候选人都比不过你。数据库岗位的笔试只是第一关后面还有更深入的面试环节。但笔试中暴露出来的知识盲区恰恰是接下来复习的指路明灯。把每一道错题都变成一次学习机会这种积累的效果会在面试中体现出来。
返回列表