
网易这套2018年校招的数据库管理工程师笔试卷我在准备面试那阵子反复刷过好几遍后来自己带实习生、帮部门出校招题也经常拿它当参照模板。说句实话这套卷子放在今天看考察的底层逻辑依然没变——它不是在考你背了多少语法而是在考你有没有建立起一套完整的数据库运维与设计认知体系。无论你准备的是大厂DBA岗、后端开发岗还是数据相关的基础设施岗把这套卷子背后的知识点吃透比刷十套leetcode都值。适合谁来读一句话打算走数据库方向、或者后端开发想补数据库内功的校招生以及想系统梳理MySQL知识体系的初级工程师。下面我从试卷结构、核心考点、实操题型、备考路线四个维度彻底拆一遍把我当时踩过的坑和后来复盘得到的经验一并写出来。1. 笔试卷整体拆解网易DBA笔试到底在考什么1.1 岗位画像与试卷命制逻辑先理解一个关键前提网易的数据库管理工程师并不是纯运维岗。在网易的业务体系里DBA要同时面对游戏、音乐、电商、邮箱等多条产品线既要保证数据库稳定可用又要配合研发做表结构设计、慢查询优化、数据迁移甚至还要参与中间件选型和容量评估。这意味着笔试考察的不是单一技能点而是一个“全栈数据库能力”的立体画像。2018年这套笔试卷的命制逻辑可以概括成三层递进第一层基础理论是否扎实包括关系代数、事务特性、范式理论、索引结构这些科班必修课。第二层工程实践是否入门包括SQL编写能力、执行计划分析、锁与死锁处理、日志机制理解。第三层架构视野是否具备包括主从复制、高可用方案、分库分表、备份恢复策略这些生产环境躲不开的话题。这三层不是割裂的而是层层递进。比如索引题表面考B树结构实际是想看你会不会根据explain的输出调整索引事务题表面考ACID实际是想看你在并发场景下能不能定位死锁。1.2 题型结构与分值分布复盘因为我手头没有原始试卷的完整官方版本下面基于这套题在各大校招论坛的回忆版和同类DBA笔试卷的共性做一个高置信度的题型结构还原。实际考试时题型顺序可能有出入但覆盖范围基本跑不出这个框架题型题量考察比重核心内容单选题15题左右25%数据库基础概念、SQL标准、索引原理、事务特性多选题5-8题15%存储引擎对比、锁机制、高可用方案特性填空题5-10空10%关键术语、SQL关键字、参数默认值简答题3-5题25%索引为什么用B树、事务隔离级别、死锁成因SQL编写题2-3题15%多表关联、聚合查询、子查询优化综合设计题1-2题10%表结构设计、慢查询优化方案、容灾架构设计从分值分布能看出来这套卷子最看重的是“理解”而非“记忆”。单选题里可能有一半是概念辨析比如“哪种隔离级别下不会出现幻读”“MyISAM与InnoDB在锁粒度上的区别”这些靠死记硬背能蒙对一部分但简答题和综合题一旦展开功底深浅立刻见分晓。1.3 考点背后的部门业务诉求我后来以面试官视角重新审视这套卷子时发现每个考点都能对应到真实的业务痛点。网易的游戏业务有大量高并发写入场景所以试卷反复出现锁、事务、主从延迟相关题目邮箱和电商业务对数据一致性要求极高所以备份恢复、容灾方案是必考项而内容型产品有海量非结构化数据所以考察你对MySQL、Redis、HBase等不同存储引擎选型的理解。也就是说你在准备笔试时不能只埋头刷题要带着“这个知识点在真实生产环境解决什么问题”的意识去学。比如索引失效的那几种情况不是用来应付填空题的而是上线前review SQL时要能一眼看出来的。2. 核心知识点系统复盘从理论基础到生产实践2.1 事务、ACID与隔离级别永远的第一座山这一块基本上是所有数据库笔试卷的开胃菜网易也不例外。但它的考法从来不是让你默写ACID四个字母而是给你一个具体的并发异常场景让你判断是哪种隔离级别下会出现的问题。先明确几个概念之间的逻辑链条。事务的四个特性——原子性、一致性、隔离性、持久性——不是并列关系而是一个保证链路。原子性靠undo log实现持久性靠redo log实现隔离性靠锁和MVCC实现一致性是前三者共同作用的结果。这个因果关系如果能讲清楚简答题基本就稳了。隔离级别这一块我建议你从头捋一遍四种级别和三种异常现象的对应关系读未提交能读到别的事务未提交的数据存在脏读。读已提交解决脏读但两次查询可能结果不同存在不可重复读。可重复读解决不可重复读但可能读到别的事务新插入的数据存在幻读。串行化全部串行执行解决所有问题但性能最差。这里有一个特别容易被忽略的细节MySQL的InnoDB默认隔离级别是可重复读但它在可重复读级别下通过间隙锁和MVCC的组合实际上已经解决了幻读问题。也就是说MySQL的可重复读和其他数据库的可重复读在语义上是不同的。这个细节一旦写在简答题里阅卷人立刻知道你是真的看过源码级资料而不是只背了《数据库系统概论》。我在准备这个知识点时做了一个特别有用的动作画了一张“异常场景-隔离级别-解决方案”的对照表把每个级别下可能出现的现象、典型SQL场景、InnoDB的具体实现机制都列出来。这个过程比刷十道题都管用因为它强迫你把知识点串成体系。2.2 索引机制从B树到最左前缀原则索引相关题目在网易这套卷子里占比极高而且出题方式非常灵活。最常见的两种出题方向是给你一条SQL问是否会走索引或者直接问你InnoDB为什么选B树而不是红黑树或哈希表。先回答“为什么是B树”这个高频简答题。你可以从三个维度展开磁盘IO角度B树是矮胖型多路搜索树层级少一次查询最多几次磁盘IO就能定位到叶子节点而红黑树是二叉树数据量大时树高几十层每次下探都是一次磁盘IO。区间查询角度B树的所有数据都在叶子节点且叶子节点通过双向链表串联天然支持范围扫描而B树的数据分散在非叶子节点做范围查询时需要中序遍历效率低。稳定性角度B树所有查询都要走到叶子节点查询次数稳定不会出现B树那样有的查询走了一层就返回、有的走了五层的波动。再说聚簇索引和非聚簇索引的区别这是DBA和开发都必须刻在脑子里的。InnoDB的主键索引就是聚簇索引叶子节点直接存储整行数据二级索引的叶子节点存储的是主键值。这意味着通过二级索引查询时如果没有覆盖索引要先查二级索引拿到主键再回表查主键索引拿整行数据这个过程叫回表。试卷里常考的覆盖索引优化本质就是让二级索引的叶子节点直接包含查询所需的全部字段省掉回表那一次IO。最左前缀原则也是必考。它说的是联合索引(a, b, c)能匹配(a)、(a,b)、(a,b,c)三种查询条件但匹配不了(b)或(b,c)。很多背过这个结论的人不知道为什么其实道理很简单联合索引是先按a排序、a相同再按b排序、b相同再按c排序的所以b单独拿出来并不是全局有序的没法走索引。理解了这个物理结构你就不会在试卷上写“联合索引就是给每个字段单独建了一个索引”这种外行话了。我还想多说一句索引失效的常见场景。网易的笔试卷里这类题通常藏在SQL优化题里作为小问。常见的失效场景包括对索引列使用函数或运算、隐式类型转换、like以通配符开头、or条件中有非索引列、not in和is not null等。这些失效原理其实可以用一句话概括优化器没法对索引列做二分查找了因为索引列的有序性被破坏了。2.3 MySQL锁机制与死锁并发场景的必修课锁和死锁是DBA笔试卷的高区分度题目因为这需要一定的实战经验才能答得透彻。2018年这套试卷里锁相关的题目出现在多选、简答和场景题里可以说无处不在。先分清锁的分类体系。从粒度上分有表级锁和行级锁InnoDB支持行级锁但MyISAM只支持表级锁从模式上分有共享锁和排他锁对应读写锁从实现机制上分有记录锁、间隙锁、临键锁。InnoDB的可重复读隔离级别下默认使用临键锁记录锁间隙锁的组合既锁住命中的记录也锁住记录前面的间隙这就是它能防止幻读的根本原因。死锁的成因要讲清楚其实就是一个循环等待事务A持有资源1的锁等待资源2事务B持有资源2的锁等待资源1两个事务都不释放自己的锁就死锁了。InnoDB的死锁检测机制会定期扫描事务等待图发现死锁后选择回滚undo量较小的事务让另一个事务继续执行。但笔试简答题不会满足于这个解释你要进一步分析死锁的常见场景多个事务以不同顺序加锁同一批资源、批量插入时间隙锁交叉、唯一索引冲突时的插入意向锁等待等。网易这类公司尤其喜欢考察批量操作场景下的死锁因为游戏业务经常有批量更新道具、批量发放奖励之类的操作稍不注意就会触发死锁。我在实际生产中处理过一个非常典型的死锁两个事务都在更新同一张表里id分别为1和2的两行但更新顺序相反。事务A先更新1再更新2事务B先更新2再更新1高并发下就会互相等待。解决方案也很经典所有事务都按id升序加锁破坏循环等待条件。这个思路在笔试卷里就是那个“如何避免死锁”的简答题满分答案。2.4 日志体系与崩溃恢复InnoDB的数据安全网如果说锁和事务解决的是并发正确性问题日志体系解决的就是“数据库崩了怎么保证不丢数据”的问题。网易的笔试卷里redo log和binlog的对比属于高频考点而且经常以填空或简答的形式出现。InnoDB的redo log是物理日志记录的是“对哪个数据页做了什么修改”主要用于崩溃恢复。它采用WAL技术事务提交时先写redo log再写数据页这样即使数据页还没刷盘数据库就崩了重启后也能通过redo log重放恢复。binlog是MySQL Server层的逻辑日志记录的是SQL语句或行变更的逻辑描述主要用于主从复制和时间点恢复。注意它和redo log有本质区别redo log是InnoDB存储引擎层的binlog是Server层的redo log是物理日志binlog是逻辑日志redo log是循环写的binlog是追加写的。这里还有一道常考陷阱题“事务提交时redo log和binlog的写入顺序是什么”答案是先写redo logprepare状态再写binlog最后把redo log改为commit状态。这个两阶段提交协议保证了崩溃恢复时两份日志的一致性如果binlog写完了但redo log还没commit恢复时会回滚该事务避免从库比主库多执行了一条事务。我把这个机制讲给实习生听的时候用过一个小卖部的类比redo log是老板的记事本先把每笔账写在本子上WAL等晚上再誊写到总账本上刷盘binlog是给总店长的日报表每天晚上提交一天的所有交易记录。记事本和日报表必须对得上先在记事本上标个“待提交”等日报表写完了再正式画勾。这个类比虽然不严谨但能帮助你建立直觉面试时再补上专业术语就完整了。2.5 主从复制与高可用架构生产环境的生存技能笔试的最后一类核心考点是数据库架构层面的。网易作为互联网大厂数据库不可能单点部署所以主从复制、读写分离、高可用切换这些内容是必考的。当然2018年的试卷里MySQL主从复制是绝对的主流MHA、MMM这类工具也常被提及。主从复制的核心原理我建议用三个线程来记忆主库的binlog dump线程负责把binlog推给从库从库的IO线程负责接收binlog并写入中继日志从库的SQL线程负责重放中继日志里的SQL。整个过程是异步的所以必然存在主从延迟。关于主从延迟的优化笔试和面试都爱考常见方案有使用半同步复制主库等待至少一个从库确认收到binlog才提交、并行复制从库多线程并行重放、减少大事务、把查询路由到合适的从库等。但你要注意优化方案不能背模板要结合场景说比如问到“主库频繁更新一行数据导致从库延迟严重”你要能说出“这个问题本质上不是复制配置问题而是业务读写模型问题可以考虑在应用层合并更新请求或者改用消息队列削峰”这种有业务感知的回答。高可用方案这块要理清两条路线基于复制的高可用MMM、MHA和基于集群协议的高可用MGR、PXC。2018年校招笔试更偏向前者因为那个年代MHA是生产环境最常见的选择。MHA的核心思路是通过选举提升一个数据最新的从库为新主库并让其他从库重新指向新主库。近几年的趋势则明显向MGRMySQL Group Replication和Orchestrator倾斜如果你现在准备校招建议两条路线都了解一下重点放在它们解决什么问题上而不是只背命令。3. 实操题型与SQL编写要点手写题拿分的完整策略3.1 典型的SQL编写与优化题网易的笔试卷里SQL题不会特别难通常就是两到三张表的关联查询加上Group By、Order By、Having这类基础语法但陷阱往往藏在细节里。我印象里有一类很典型的题给定一张订单表和一张用户表要求统计每个用户的订单总金额并按金额降序排取出前五名。看起来简单但如果要求“用户即使没有订单也要显示为0”就要用LEFT JOIN而不是INNER JOIN而且要注意LEFT JOIN后用WHERE还是ON过滤条件——用WHERE会过滤掉右表为NULL的行相当于把LEFT JOIN退化成INNER JOIN。还有一类必考的是“查找重复数据”和“删除重复数据”。查找重复数据通常用GROUP BY和HAVING COUNT(*)1删除重复数据如果面试官要求保留一条就要借助临时表或者子查询MySQL里可以用DELETE t1 FROM table t1 JOIN table t2 ON t1.name t2.name WHERE t1.id t2.id这个经典写法。这些SQL题的共性在于考察的不只是会不会写而是能不能写出“正确且高效”的写法这也符合网易对DBA动手能力的要求。3.2 数据库设计题范式与反范式的权衡综合设计题是拉开差距的题型。网易的考法通常是给一个业务场景让你设计表结构并解释设计理由。比如常见的“设计一个微博点赞系统”或“设计一个商品评论系统”本质考察的是你对范式和反范式的理解。教科书会告诉你第一范式保证字段原子性第二范式消除部分依赖第三范式消除传递依赖。但实际生产环境中完全遵循第三范式往往意味着大量表关联查询性能上不去。所以DBA在设计表时要做的是权衡在一致性要求高、查询路径固定的场景下适度反范式化。以点赞系统为例一个朴素的三范式设计是用户表、帖子表、点赞关系表。查询某个帖子被谁点赞了JOIN两张表就可以。但如果业务要频繁展示“帖子点赞总数”每次都COUNT点赞关系表数据量大时性能很差。常见的做法是在帖子表增加一个like_count冗余字段每次有人点赞时通过事务同时更新它。这样查询总数就是一次主键查询代价是引入了数据一致性维护的复杂度。笔试时你要能把这个权衡过程写清楚这比直接写出表结构得分高得多。关于范式我再补充一个笔试容易踩坑的点题目如果问“某张表是否符合第三范式”你要先明确主键和函数依赖关系再逐一判断非主属性对主键的依赖性质。不要凭感觉往下写这类题按步骤拆解一定能拿分。3.3 故障排查与优化场景题综合题的另一种形式是给一段慢SQL让你分析原因并给出优化方案。这类题我建议按照“找问题-析原因-给方案-做验证”四步法来回答卷面呈现会很完整。举个例子题目给了一条订单表的查询“SELECT * FROM orders WHERE user_id 123 AND order_date BETWEEN 2018-01-01 AND 2018-06-01”并且告诉你这条SQL很慢。你首先要想到可能的原因是表数据量大且没有合适的索引。然后判断user_id的区分度和order_date的区分度正常情况下应该建立联合索引(user_id, order_date)注意顺序不能反——user_id是等值条件放前面order_date是范围条件放后面。如果再进一步优化可以改成覆盖索引把要查询的字段也塞进索引里避免回表。还有一类排查题会给出数据库整体变慢的告警让考生判断可能原因。这种题考察的是全局排查思路慢SQL、锁等待、连接数打满、磁盘IO过高、内存不足导致swap这些都是必须列上的候选方向。回答时决不能只写一句“可能是慢查询导致的”而要有逻辑地排出优先级先检查监控看是否是资源瓶颈再查processlist看当前会话在做什么再分析慢查询日志确认根因。这个思路放在今天依然是排查数据库问题的标准动作提前练熟笔试和实际工作都受益。4. 备考路线与常见问题速查这套试卷教给我的学习框架4.1 时间分配与复习路径建议如果你现在才开始准备数据库岗位的校招我建议按四周来规划但可以根据自己的基础灵活调整。第一周聚焦基础理论把事务、隔离级别、范式、索引原理吃透配合《数据库系统概论》和《高性能MySQL》前几章第二周主攻MySQL实战重点掌握InnoDB架构、日志机制、锁机制把每一块都画成思维导图第三周刷SQL和设计题尤其要多练习多表关联、聚合查询和索引优化第四周做高可用和备份恢复的架构型准备了解主从复制原理、常见高可用方案对比再看几篇主流公司的数据库实践分享。时间紧的话可以按考试分值分配复习时长。概念记忆类的单选和多选性价比最高的是索引和事务简答题最可能出的是索引为什么用B树、事务隔离级别、死锁成因与分析SQL题要多练综合题则要靠平时积累。不要试图从头到尾背一遍文档那是准备笔试最无效的方式——网易要的是能动手解决问题的人不是数据库百科全书。4.2 常见易混淆点速查表我在带新人和做内部分享时经常整理一张易混淆知识点对照表这里挑最核心的几个列出来给你参考易混淆点关键区别redo log vs binlogredo log是InnoDB物理日志崩溃恢复用binlog是Server层逻辑日志复制与恢复用MyISAM vs InnoDBMyISAM不支持事务、行级锁、崩溃恢复只支持表级锁InnoDB全部支持聚簇索引 vs 二级索引聚簇索引叶子存整行二级索引叶子存主键二级索引查询可能回表共享锁 vs 排他锁共享锁之间兼容排他锁与任何锁都互斥三范式 vs 反范式三范式减少冗余、保证一致性但可能增加JOIN反范式牺牲一致性换取查询性能垂直拆分 vs 水平拆分垂直按字段拆分水平按行数据拆分这个表不建议直接背建议自己动手整理一遍整理过程中你自然会把知识点之间的关系打通。4.3 实战中的坑与心得最后说几个我在实际准备和工作中踩过的坑也算是对这套试卷学习路径的一个补充。第一个坑是只学MySQL不看整体。网易的业务场景里关系型数据库之外还有Redis做缓存、ES做搜索、HBase做海量存储。笔试虽然以MySQL为主但综合设计题里如果你能主动提到“哪些数据适合放缓存、哪些适合放搜索引擎、哪些适合放列式存储”会显得很有架构意识。第二个坑是操作题只看不做。SQL写得好不好根本在于练习量。我当时准备笔试时把每一个SQL优化题都拿到本地的MySQL环境里跑一遍用EXPLAIN看执行计划对比优化前后的key_len和rows。这个过程看起来很耗时间但对理解索引的帮助是任何资料都给不了的。第三个坑是忽略备份恢复。很多人备考数据库时觉得备份恢复是运维的事笔试也未必考。但网易这类大厂恰恰很看重这个能力因为DBA的核心职责之一就是保证数据不丢。至少要知道全量备份、增量备份、binlog备份的组合策略以及恢复时的正确顺序。这些知识看起来不起眼但它在真实生产环境中是“救命”级别的技能笔试考出来也毫不意外。第四个心得是你一定要亲手做一次主从复制的实验。哪怕是在自己电脑上用Docker起两个MySQL实例照着官方文档配置一遍主从观察binlog和relay log的变化再模拟一次主库宕机、手动提升从库的操作。这个实验做完你对复制的理解会远超只看文档的人笔试里遇到主从相关题目你能写出很多别人写不出的细节。4.4 关于国产数据库的一点延伸2018年网易的笔试卷里主角是MySQL和Oracle这是当时的时代背景。但现在如果你准备新一年的校招我非常建议在掌握MySQL的基础上花一点时间了解国产数据库的生态比如达梦、人大金仓、GaussDB、OceanBase、TiDB这些。笔试不一定直接考但面试聊架构时如果你能表达出“了解国产数据库的发展现状并知道它们在特定场景下的适用性与限制”会是一个显著的加分项。延伸学习的时候不用贪多挑一个开源的分布式数据库比如TiDB理解它如何兼容MySQL协议、如何做水平扩展、如何处理分布式事务就足够了。它和传统单机MySQL的对比本身就是很好的架构面试题素材。我在指导新人时经常说一句话数据库的知识体系是树状的MySQL是主干其他的存储引擎、中间件、分布式方案都是枝干先把主干扎扎实实立起来再沿着枝干扩展认知这才是最高效的学习路径。