尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

网易校招数据库管理工程师笔试备考:SQL、事务与索引优化全攻略

网易校招数据库管理工程师笔试备考:SQL、事务与索引优化全攻略 网易2023校招提前批放出的数据库管理工程师杭研岗位笔试到底考什么、怎么准备是很多准备校招的同学最关心的问题。我前后参与过不少校招出题和评审工作也帮团队筛过大量简历可以负责任地说数据库管理工程师的笔试和开发岗是两条完全不同的线算法题不是主角真正拉开差距的是数据库原理、SQL基本功、事务与锁、索引与性能优化、高可用与日常运维这些硬核模块。这篇文章不涉及任何具体真题保密范围内我也拿不到而是按岗位的普遍考察规律整理出一条可落地的备考主线。它适合正在准备网易校招的同学也适合所有想往数据库方向走的求职者参考。1. 岗位画像与笔试考察逻辑1.1 数据库管理工程师在杭研做什么数据库管理工程师这个岗位在校招里经常被误解成“高级DBA”。实际上杭研这类互联网公司的数据库管理工程师职责范围比传统DBA更宽既要管数据库的日常稳定运行也要参与业务侧的数据库设计、SQL审核、慢查询治理、容量规划还会涉及数据同步、备份恢复、高可用架构的落地。说白了这个岗位要的是“能听懂业务也能搞定数据库底层”的人。这和后端开发岗位的最大区别在于后端开发写业务逻辑数据库管理工程师是在“伺候”支撑业务的数据底座。笔试也因此不会考太多算法题反而更看重对数据库内核机制的理解深度和工程手感。理解了这一点你就能明白为什么笔试的重点是那些“看似基础、实则能拉开差距”的数据库知识点。1.2 提前批笔试的科目结构与筛选逻辑提前批的笔试时间一般比较紧张题量不算小题型大致可以分成三类题型常见内容考察目标基础选择题数据库原理、事务、索引、SQL语法知识面是否成体系手写SQL题多表关联、聚合统计、窗口函数动手能力是否过硬综合场景题死锁分析、慢SQL优化、高可用设计工程思维和排错能力出题的筛选逻辑很清晰先靠基础题淘汰知识不扎实的人再靠手写SQL淘汰“只会背概念不会写”的人最后靠场景题找到真正有数据库思维的人。所以备考时不要把精力全砸在背概念上手写SQL和场景分析必须要练。2. 高频考点拆解SQL基本功不能有短板2.1 增删改查与多表关联是基础盘说实话SQL这一关刷掉的人比我预期的多。很多人以为“能用SELECT查数据”就算会SQL但笔试的手写SQL题对逻辑严谨性要求很高。比如经典的学生-课程-成绩三表关联查询看起来简单写出来经常出现表别名混乱、GROUP BY漏字段、HAVING和WHERE混用这些小毛病。我给的训练建议是把日常CRUD的每个环节都过一遍包括INSERT批量插入、UPDATE与表连接一起用、DELETE配合子查询、MERGE的处理逻辑别只停留在SELECT。笔试里考察的“数据库增删改查”从来不是单表操作而是多表之间的关联和一致性维护。另外数据库设计的基础素养也常在这里出现比如三范式、ER模型、反范式设计的取舍如果你正在上数据库课程设计别只是交差用心把表和字段之间的关系理顺笔试时能省不少力。你可以用下面这个题目自测-- 表结构students(id, name, class_id)courses(id, name) -- scores(student_id, course_id, score) -- 需求查询每门课程分数最高的学生姓名、课程名、分数 SELECT c.name AS course_name, s.name AS student_name, t.max_score FROM ( SELECT course_id, MAX(score) AS max_score FROM scores GROUP BY course_id ) t JOIN scores sc ON sc.course_id t.course_id AND sc.score t.max_score JOIN students s ON s.id sc.student_id JOIN courses c ON c.id sc.course_id ORDER BY c.name;这道题的考点很典型先聚合找出最大值再回表关联查出对应的学生。如果笔试里遇到这类题你还要注意分数并列的问题——如果一门课有两个最高分子查询方式会同时带出多行这时要看题目是否要求去重。2.2 窗口函数笔试里的“拉分题”窗口函数是近些年校招笔试的高频拉分点。它本质上是在不改变结果集行数的前提下对每一行做聚合或排名计算。很多人在这里直接卡住是因为没有理解“窗口”的范围是怎么框定的。一个很常见的考察场景是“查询每个部门薪资排名前两名的员工”。用传统子查询会很绕但用窗口函数就是几行的事SELECT department_id, employee_name, salary, rn FROM ( SELECT department_id, employee_name, salary, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rn FROM employees ) t WHERE rn 2;这里要注意ROW_NUMBER()、RANK()、DENSE_RANK()三者的区别笔试极爱考ROW_NUMBER()生成的序号不重复RANK()遇到相同值会跳过序号DENSE_RANK()遇到相同值不跳号。你在答场景题时先看清题目问的是“前两名”还是“前两个名次”再决定用哪个函数。2.3 手写SQL的通用踩坑清单SQL这部分的复习我建议你准备一个错题本专门记录手写时犯的低级错误。我帮人复盘时发现最常见的几类问题GROUP BY 查询的字段没有全部放进分组中导致结果不符合预期WHERE 和 HAVING 的过滤时机混淆WHERE 在分组前HAVING 在分组后JOIN 时忽略关联键的NULL值行为INNER JOIN与LEFT JOIN结果判断失误题目要求保留小数或处理NULL时忘记用ROUND、IFNULL、COALESCE这类函数排序时多字段顺序写反比如“先按时间倒序再按金额排序”和“先按金额再按时间”结果完全不同这些错误不是“不会”而是“手生”。笔试前两周每天保持10道以上手写SQL的频率比看十遍理论书都管用。尤其是增删改查之外的聚合统计和关联查询宁可多花时间练到条件反射也别到考场才现场想语法。3. 重头戏事务、锁与并发控制3.1 为什么ACID总被反复问数据库管理工程师的笔试几乎绕不开事务。原因很简单只要系统的数据不能出错事务就是保底的那道防线。ACID这四个特性不只是背定义你要能说清楚每个特性对应到底层哪个机制。比如原子性靠undo log回滚日志保证持久性靠redo log重做日志保证隔离性靠锁和MVCC保证一致性则是在前面三者的共同作用下实现的。很多同学在回答ACID时只能把四个特性背一遍但笔试更想看到的是“机制对应”的能力。你可以自己在纸上画一条事务的执行路径开启事务、修改数据、写undo日志、写redo日志、提交、刷盘然后思考如果每个环节崩溃会发生什么。把这条路径想明白选择题和简答题都不容易丢分。另一个常考的延伸点是“唯一索引冲突”。比如一张表里已经有了重复数据线上却要加唯一索引会直接报错。正确的处理思路是先查询重复数据保留业务上需要保留的一条清理其余数据后再创建唯一索引。这种题看似简单考的是你有没有真正操作过生产环境的索引变更。3.2 隔离级别与MVCC的理解误区SQL标准定义了四种隔离级别读未提交、读已提交、可重复读、串行化。MySQL默认是可重复读这一点很多人背得住但问到“可重复读为什么还解决不了幻读”就答不上来了。这里有个关键认知必须理清InnoDB的可重复读通过MVCC的快照读解决了大部分幻读问题但在当前读的场景下仍然可能需要临键锁(Next-Key Lock)来彻底防止幻读。MVCC的原理可以做一个生活化类比你打开一份文档时系统给你一份当时的“快照”之后别人怎么改原文档你看到的都还是快照里的内容直到你重新打开文档。这个设计让读操作不用阻塞写操作大大提升了并发度。笔试面对这类题建议按“什么隔离级别-什么问题场景-底层什么机制解决”的框架来回答条理清楚得分点也齐全。3.3 死锁与锁竞争场景题怎么分析场景题里最容易让人懵的是死锁分析。典型题目两个事务分别修改A、B两条记录执行顺序交叉时会不会死锁答案是要看加锁顺序是否一致。事务1先锁A再锁B事务2先锁B再锁A两个事务互相等待对方的锁就形成了死锁。注意分析死锁题有个通用套路就是先各自画“持有锁→等待锁”的箭头再判断箭头是否成环。成环是死锁的必要条件不成环说明只是锁等待两条路线的结论完全不同。数据库检测到死锁通常会让其中一个事务回滚另一个继续执行。你在笔试里遇到这种题可以按三步来推画出每个事务持有的锁和等待的锁判断等待关系是否形成环分析数据库死锁检测机制会如何选择牺牲者另外还要知道“数据库死锁”和“争用”不是一回事。大量并发访问同一行数据时锁等待会很严重但还没达到互等资源的死锁程度。这时候的优化方向是减少锁粒度、控制事务执行时间、合理设计索引走更少的行。笔试问“如何降低锁竞争”答案不要只说“用乐观锁”而要结合具体场景讲清楚替代方案。还有一个容易被忽略的点开启数据库审计功能后审计日志写入如果和业务SQL争抢系统资源可能引发索引争用和锁等待这在新增审计策略时必须提前评估。4. 索引与SQL性能优化拉开差距的核心4.1 索引失效的常见场景索引相关题目在笔试中的占比相当高因为它是从“能查出来”到“查得快”的分水岭。很多同学背得出“联合索引最左前缀原则”但一给具体SQL就判断错。最常见的索引失效场景包括对索引列使用函数、隐式类型转换、LIKE以百分号开头、OR连接非索引列、联合索引不按最左前缀使用。比如WHERE DATE(create_time) 2024-01-01会导致create_time上的索引失效你应该改写为WHERE create_time 2024-01-01 AND create_time 2024-01-02让索引能走范围扫描。我发现很多人在复习索引时只看“失效”的结果不理解底层原因。一个有用的思路是索引本质上是一种有序结构查询能走索引是因为可以利用有序性快速定位。一旦对列做了函数计算原本的顺序就被打破了优化器无法再依靠索引进行快速定位只能回表扫描。把这一条想明白判断索引失效题就不会错。4.2 执行计划怎么读笔试场景题里常给出一段慢SQL让你分析原因并优化。这时执行计划就是你最重要的依据。优先看几个关键字段字段含义关注点type访问类型从system到ALL走全表扫描就要警惕key实际使用的索引NULL表示没走索引rows预估扫描行数与最终性能强相关Extra额外信息Using filesort、Using temporary要优化比如Extra里出现Using filesort说明排序没有用到索引可以考虑在ORDER BY字段上建立合适的联合索引。出现Using temporary通常意味着GROUP BY或去重操作创建了临时表数据量大时性能会很差。优化方向往往是改写SQL或者调整索引让操作能走索引顺序完成。这里我要提醒你笔试中的执行计划题不会让你真的去生产环境跑EXPLAIN但你要能根据给出的计划片段判断瓶颈。复习时可以自己在本地建一张几万行的表跑一跑EXPLAIN尝试用不同索引和SQL写法对比rows和Extra的变化这个过程能帮你形成非常直观的“索引手感”。本地可以用SQLite或者MySQL都行不用太在意数据库版本差异重点是理解优化器关注的核心因素。4.3 慢SQL优化思路框架遇到慢SQL优化题我建议按固定框架作答避免漏掉得分点。首先是定位问题用慢查询日志或者执行计划找出是哪一步耗时最高。其次是改写SQL减少不回表的扫描行数、消除不必要的DISTINCT和ORDER BY、把子查询改写成JOIN或反向改写。然后是索引优化根据WHERE过滤、JOIN关联、ORDER BY排序字段选择合适的单列索引或联合索引。最后还有一个容易被忽略的点把业务需求看清楚。我见过不少人把一条查询改得花里胡哨结果业务上其实只需要5条数据加个LIMIT就能大幅降级扫描成本。数据库优化不是炫技而是理解业务后做最小代价的调整这一点在综合场景题里特别加分。如果你在开发中经常使用ORM框架也要能识别ORM生成的SQL和手写SQL之间的性能差异笔试有时会让你判断一段ORM操作对应到数据库层面的真实代价。5. 数据库管理与高可用实践工程师的“本行”5.1 主从复制与常见高可用方案数据库管理工程师和开发岗的一个明显差异就是笔试会涉及很多日常运维和架构层面的知识。主从复制几乎是必考的基础点主库把变更写入二进制日志从库的I/O线程拉取日志并写入中继日志SQL线程再重放中继日志完成数据同步。这个链路中的每一步都可能出问题笔试常问“主从延迟怎么排查”答案方向通常是查看从库Seconds_Behind_Master指标、分析是否有大事务、检查从库所在机器的磁盘或CPU压力、确认是否缺少主键导致回放慢。高可用方案也是考察热点。如果问到传统的主从切换和MGR这类方案的区别你可以从数据一致性、故障自动检测、脑裂处理等角度展开。注意不要只背方案名称而要理解每个方案的权衡强调高可用可能会牺牲一点故障切换的时间强调数据一致性又可能在某些场景降低可用性。能在笔试里把权衡关系讲清楚的人明显更受面试官喜欢。数据同步也是这个岗位绕不开的话题。无论是跨机房同步、异构数据库同步还是把线上库导入分析库都会用到各类数据库同步软件或工具。笔试里不一定会让你写工具名但你要理解同步的本质是“日志抓取转换回放”并且知道同步延迟、数据冲突、断点续传这几个核心问题是怎么被解决的。5.2 备份恢复与数据安全备份恢复是数据库管理者的基本功也会以场景题形式出现在笔试里。你需要理解物理备份和逻辑备份的区别物理备份直接拷贝数据文件恢复快但对版本和平台敏感逻辑备份导出SQL或文本格式数据灵活性强但恢复慢。还要知道全量备份、增量备份、差异备份的适用场景。有一个高频问答是“误删了生产表数据怎么尽快恢复”。完整的思路是先看有没有最近的全量备份再看备份之后有没有归档日志或binlog然后通过binlog按时间点回放找回数据。这类题考察的不是具体命令而是你对“备份链”有没有完整认知。还值得提醒的是备份要定期做恢复演练否则备份文件可能是坏的这个坑在真实工作中非常常见笔试答出来会显得很有实战经验。关于数据安全还有一个角度就是权限管理和审计。最小权限原则、分离管理员与业务账号、敏感数据脱敏这些概念在开放题里都可能出现。数据库审计本身是把双刃剑审计能增强安全但不加评估地开启审计日志量的暴增可能引入严重的性能问题甚至加剧索引争用回答时能把“安全”和“性能”的平衡说出来层次会高很多。5.3 数据库生态与国产数据库的认知储备这几年国产数据库的讨论度很高网易这类大厂校招笔试里也偶尔会出现开放性问题比如“如何看待国产数据库的发展”“数据库选型会考虑哪些因素”。这类题不要求你精通达梦、人大金仓、GaussDB、OceanBase等产品的细节但至少要有基础认知了解它们多数基于PostgreSQL或MySQL生态发展而来了解国产数据库面临的兼容性、生态工具链、迁移成本等问题。我建议准备这个方向时不要去背“国产数据库排名前十名”这类文章而是围绕三条主线整理自己的观点一是兼容性迁移从Oracle或MySQL迁来要改什么二是生态工具数据同步、监控、备份工具是否齐全三是核心场景的稳定性案例。能在笔试里说出“选型不是选数据库本身而是选整个生态”这种有深度的观点会让整份答卷显得成熟很多。数据库生态里还可以顺带准备一下新兴方向。比如时序数据库适合监控指标和物联网数据向量数据库更适合大模型的相似度检索场景。这类开放题不要求你写底层实现但至少要能说出它们各自解决什么问题、和传统关系型数据库的区别是什么。知道这些遇到开放性提问时你不会无话可说。6. 复习路径与投递建议怎么准备最高效6.1 三轮复习法针对网易校招数据库管理工程师这类岗位的笔试我比较推荐三轮复习法时间充裕可以拉长到四到六周时间紧张最少保证三周。第一轮打基础用3到5天系统过一遍数据库原理重点吃透事务、索引、锁、SQL标准概念。这一轮不要贪多目标是形成知识地图知道每个知识点在哪个模块下。第二轮刷题强化用7到10天集中刷数据库面试题和SQL题。这一轮要专门整理错题把每一道错题映射回知识点找出是概念不清、原理不明还是手写能力不足。注意现在的热词和题目趋势也在变化比如“数据库面试题”“数据库并发锁”“数据库死锁”这些方向容易被反复翻新考察刷题时要多归纳同一知识点的不同问法。第三轮实战模拟考前3到5天按笔试的时间要求做整套模拟题锻炼答题节奏。手写SQL题目要实际写在纸上或编辑器里不要只在脑中过一遍避免考试时手生。最后把错题本从头到尾过一遍状态就基本到位了。6.2 值得投入时间的具体清单结合笔试考察重点我列一个“投入产出比较高”的复习清单你可以直接对照自查模块必须掌握的点建议投入SQL多表关联、聚合、窗口函数、子查询每天手写10题事务与锁ACID机制、隔离级别、MVCC、死锁分析深挖原理2天索引优化失效场景、执行计划、慢SQL优化结合实际EXPLAIN练习高可用与运维主从复制、备份恢复、高可用方案讲清原理方案对比数据库生态国产数据库、同步工具、选型思路准备2个观点来表达这个清单不是我拍脑袋写的而是把近几年校招数据库岗的考察热点压缩后的结果。你不用面面俱到但每个模块至少要有能讲透的程度笔试基础分就稳了。顺带说一下数据库实例层面的知识也别完全空白比如给SQLite这类单文件数据库做一次完整的建库、建表、查询操作体验一遍“数据库软件”从安装到使用的基本流程能帮你建立对数据库工具链的直观感觉。6.3 投递与笔试心态上的建议最后一个建议是关于投递节奏的。提前批的特点是开启早、流程快如果你还处于“先投递再复习”的状态风险很大。我见过太多人提前批投完笔试通知一到手才发现自己连SQL都手生只能硬着头皮上。正确做法是决定投递的那一刻就开始按清单复习收到笔试邀约后再做针对性的冲刺和模拟。笔试过程中遇到不会的题先跳过去做后面会的别在一道场景题上耗太久。数据库管理工程师岗位的题量通常不小答完比答完美更重要。即使最后没有通过提前批也不用灰心正式批通常还有机会提前批的笔试复盘本身就是一次高价值的训练。我自己带团队面试时最怕看到的就是候选人背了一堆“八股定理”但一问“这个机制在什么场景下会出问题”就哑火。网易杭研数据库管理工程师笔试的考点其实都在围绕一个核心问题转你有没有真正用数据库处理过问题而不是只背过数据库。复习到最后你会发现所有知识都是串起来的——SQL查不快就回到索引索引乱了就回到数据分布数据出错了就回到事务和锁。把这条主线理清笔试只是顺带的事。
返回列表