
这场笔试是我参加过的最特别的一场校招笔试。我们通常习惯的那种算法题选择题的互联网校招套路在网易杭研数据库管理工程师的提前批里几乎失效了。整张卷子给人的感觉不是我在考算法而是我在被审核有没有资格当一名DBA。它不关心你能不能二十分钟写出一道hard级别的LeetCode它关心的是你对一条SQL的生命周期到底理解到什么程度你知不知道线上一条慢查询会以怎样的链路拖垮一个库你有没有想过数据库崩溃之后数据是怎么回来的。这篇文章我拖了很久才写。因为笔试结束后我复盘了很久发现这场笔试的价值被很多人低估了。它不是一个简单的知识测试而是把数据库管理工程师这个岗位的日常挑战浓缩进了一份卷子。无论你是准备网易的校招还是想系统评估一下自己有没有做数据库方向的能力这篇复盘都值得你花十分钟读完。1. 岗位画像篇数据库管理工程师到底在招什么样的人1.1 一场不按套路出牌的笔试拿到试卷的第一反应是题型分布和我想的不一样。没有上来就甩一道hard级算法题也没有纯八股式的名词解释堆砌。整个卷子更像是一个数据库体检单从SQL基础、事务原理、索引优化再到高可用架构、故障排查一层一层往下探。这其实是网易这类互联网公司数据库团队笔试的典型风格。他们不那么在意你能背多少八股文而是想通过笔试模拟一个真实工作场景给你一个出了问题的数据库你会怎么定位给你一条慢查询你会怎么优化给你一个数据不一致的场景你能说出哪些可能的原因我印象最深的一道题是给了一段线上环境的异常日志让你判断最可能的原因是什么。这种题没有标准答案八股考的就是你有没有真实的MySQL运维经验哪怕只是阅读过相关的故障案例。如果你只是会写CRUD没有深入过数据库的底层运行机制这种题基本靠蒙。1.2 DBA与后端开发笔试考察逻辑的根本差异这一点我觉得有必要单独拿出来说因为很多同学在准备数据库管理工程师的时候用的是准备后端开发岗的思路。这个方向错了。后端开发笔试的核心是算法与系统设计能力考察的是你能否用代码完成业务功能。而数据库管理工程师笔试的核心是稳定、一致、高效这三个词考察的是你能否让一套支撑业务的数据库长期稳定运行。前者是建设者后者更像是保障者。这种差异在题目设置上体现得非常明显。后端笔试会问你如何设计一个秒杀系统而数据库笔试更可能会问你秒杀场景下数据库连接池的容量如何评估热点行更新怎么避免锁冲突突发流量下主库扛不住了你是先扩容还是先拆分因此如果你只是刷题、背算法那么数据库笔试一定会让你觉得使不上劲。你需要的是建立一整套关于数据库运行机制的知识框架并且能把这些框架投射到具体的故障场景里。1.3 网易杭研的考察偏好具体到网易杭研这个岗位我的感受是他们的笔试非常务实。题目范围很广但每一题几乎都不白给要么考你原理要么考你实操要么考你在极端场景下的判断力。杭研这边的业务线大家应该都有耳闻网易云音乐、网易严选、网易数帆这些产品都有大规模数据库使用场景尤其是云音乐这种高并发读写、高峰时段流量波动极大的业务对数据库团队的要求不只是会装会配而是能在极端压力下保证稳定。所以笔试里出现性能优化类和故障恢复类的题目我并不意外。我建议后续要投这个岗位的同学笔试前认真研究一下网易的业务形态想一想这些业务对数据库的挑战在哪里。例如云音乐的评论、歌单、用户行为数据哪些适合用MySQL哪些适合用缓存哪些需要走ES或者列存这种用数据库解决业务问题的思路恰恰是笔试想看到的。2. 考点地图篇笔试题型与知识板块全景拆解2.1 客观题细碎知识点地毯式扫描笔试的第一板块是大量的客观题有单选也有多选。这些题覆盖面很广从SQL语法细节到InnoDB存储引擎的参数再到各种日志的作用可以说把数据库知识的边边角角都扫了一遍。我回忆几个印象深刻的点供大家参考。第一类是存储引擎相关。MyISAM和InnoDB的区别几乎是必考的。这题看似简单但如果你想拿满分需要答出InnoDB支持事务、支持行级锁、支持外键、支持崩溃恢复而MyISAM只支持表级锁、不支持事务、崩溃后恢复能力差。更细一点还要知道InnoDB在MySQL 5.7以后支持全文索引而MyISAM的索引和数据是分开存储的InnoDB的数据和主键索引是存放在一起的。这些细节没有实际操作经验的话很容易记混。第二类是日志相关的题。redo log、undo log、binlog这三者有什么区别和联系是DBA笔试的高频题。简单来说redo log是InnoDB存储引擎层的物理日志记录的是数据页做了什么修改用于崩溃恢复undo log是逻辑日志用于事务回滚和多版本并发控制MVCCbinlog是MySQL Server层的逻辑日志记录的是执行的SQL语句或行变更用于主从复制和时间点恢复。三者的协作逻辑是事务提交时先写redo log并保证落盘再写binlog崩溃恢复时用redo log恢复数据页用undo log回滚未提交的事务。第三类是会考察MySQL参数层面的东西。比如max_connections、innodb_buffer_pool_size、slow_query_log这些参数是干嘛的怎么调优。这类题没有运维经验的同学会比较吃亏因为它们不是看书就能记住的而是要在实际环境中观察过、调整过才会有直观感受。2.2 SQL手写题从增删改查到分析函数客观题之后是SQL手写题。这部分和很多同学预想的不一样它不只是简单的SELECT、INSERT、UPDATE、DELETE而是大量考察了多表关联、子查询、聚合函数、窗口函数等进阶语法。比如有一道题给了两张业务表一张是用户表一张是订单表要求统计出每个用户的首次下单时间以及该用户累计下单金额排名前两名的订单。这种题放到数据仓库笔试里也完全成立但出现在DBA笔试里说明他们对SQL基本功的要求是很高的。因为DBA日常工作中写SQL的机会确实不少跑数据、排查问题、做数据订正都要用SQL。针对这类题我最想提醒大家的是窗口函数一定要熟练。ROW_NUMBER()、RANK()、DENSE_RANK()三者的区别必须刻在脑子里。ROW_NUMBER()是纯行号排序值相同也会分配不同的序号RANK()会为相同值分配相同序号但后续序号会跳过比如1、1、3DENSE_RANK()则不会跳过是1、1、2。很多场景下取每个分组Top N这类需求用ROW_NUMBER()配PARTITION BY就能完美解决。另外分组统计时GROUP BY和HAVING的配合、WHERE与HAVING的执行顺序WHERE先过滤行HAVING后过滤分组也是高频考点。还有各种JOIN的区别特别是LEFT JOIN和INNER JOIN在数据匹配上的语义差异稍不留神就会写错。2.3 设计题表设计、索引设计与反范式笔试里还有一部分是数据库设计题给定一个业务场景要求你设计表结构并给出索引方案。这类题考的不只是会不会建表而是有没有工程经验。举个例子如果场景是一个社交App的好友关系表你需要考虑是用自增主键还是业务主键好友关系是单向关注还是双向好友查询最频繁的是我关注了谁还是谁关注了我这两个查询方向是否需要分别建索引为了满足互相关注的查询是否可以考虑冗余存储我在设计题上踩过的一个坑是一开始把表设计得过度范式化导致查询的时候需要关联五六张表。后来复盘才意识到互联网业务中大部分场景是读多写少为了查询性能可以在一定程度上做反范式设计比如冗余一些字段、预计算一些统计值。笔试中不会有人告诉你应该在三范式和查询性能之间怎么取舍但阅卷人一定能看出来你有没有这种平衡意识。索引设计这里有一个必须要掌握的面试/笔试考点联合索引的最左前缀原则。建一个(a, b, c)联合索引查询条件如果只包含b和c那这个索引是走不上的如果包含a和b则可以走索引。还有覆盖索引的概念如果查询列都能在索引中找到就无需回表性能会高很多。设计题里合理使用联合索引和覆盖索引往往是拉开分数差距的关键。3. 底层原理篇事务、锁与索引的必考铁三角3.1 InnoDB索引为什么是B树而不是别的树数据库笔试基本绕不开索引这个话题而索引题的核心又是InnoDB为什么用B树这题看似基础但想答好需要同时理解两层逻辑。第一层是B树相比其他数据结构在数据库场景里有什么优势第二层是InnoDB具体是怎么用B树的关于第一层最常拿来对比的是B树和哈希索引。哈希索引的等值查询确实是O(1)级别但无法支持范围查询和排序B树的每个节点既保存索引键又保存数据导致单个节点能存储的键数量更少树更高磁盘IO次数更多而B树的所有数据都在叶子节点非叶子节点只存索引键节点能容纳更多键树更矮同时叶子节点之间用链表相连非常适合范围查询和顺序扫描。关于第二层InnoDB的每张表实际上就是一个以主键为索引键的B树叶子节点存储了整行数据这叫聚簇索引。二级索引的叶子节点不存储完整行而是存储主键值因此通过二级索引查询时通常还要回表到聚簇索引再查一次。如果你能让阅卷人感觉到你是从树的样子去理解索引的而不是背概念这道题基本就稳了。3.2 事务隔离级别与MVCC事务ACID属性是基础但笔试真正拉开差距的是对隔离级别和MVCC的深入理解。标准SQL定义了四种隔离级别读未提交、读已提交、可重复读、串行化。MySQL InnoDB的默认级别是可重复读Repeatable Read。为什么MySQL的默认隔离级别和其他数据库不一样这一点是很多面试官喜欢追问的问题笔试也常以判断题的形式出现。答案在于InnoDB通过MVCC多版本并发控制在可重复读级别下已经解决了部分幻读问题。MVCC的实现依赖三个核心东西隐藏字段DB_TRX_ID事务ID、DB_ROLL_PTR回滚指针、undo log版本链、ReadView一致性视图。在可重复读级别下事务在第一次查询时生成ReadView后续复用这个ReadView从而保证多次查询结果一致。而读已提交级别下每次查询都会生成新的ReadView所以会出现不可重复读。笔试中关于MVCC还有一个高频陷阱题快照读和当前读。普通的SELECT是快照读不加锁通过MVCC读历史版本而SELECT ... FOR UPDATE、UPDATE、DELETE是当前读读取最新版本并加锁。这个知识点如果没理解透很容易在哪些操作会加锁这类多选题上出错。3.3 死锁从原理到排查我在笔试中遇到一个很典型的场景题两个事务分别执行两条UPDATE语句更新顺序相反导致死锁问你怎么排查、怎么解决。要答好这道题先得把死锁的四个必要条件说清楚互斥、持有并等待、不可剥夺、循环等待。然后结合InnoDB场景说明行锁是互斥的事务A持有行1的锁并等待行2事务B持有行2的锁并等待行1于是产生循环等待。排查死锁的手段是通过SHOW ENGINE INNODB STATUS查看LATEST DETECTED DEADLOCK部分里面会记录死锁涉及的事务、加锁的SQL、持有的锁和等待的锁。模拟死锁场景你还可以打开innodb_print_all_deadlocks参数把每次死锁信息都打印到错误日志里方便事后分析。解决死锁的思路通常有几个方向一是让所有事务按照相同的顺序访问资源比如都先更新小ID的行再更新大ID的行二是在高并发场景下减少大事务缩短持锁时间三是合理设计索引尽量让锁定的行范围变小四是在业务允许的情况下降低隔离级别。真题里最容易出的是第一种方向也就是统一加锁顺序。4. 故障实操篇运维场景题里的互联网真实环境4.1 慢查询Explain的正确打开方式在DBA的日常工作中慢查询处理可能是最高频的工作之一。笔试中一定会出现慢查询优化的题目而这类题的核心工具就是Explain。给我印象最深的一道题是这样的一条SQL执行非常慢表里数据量在千万级Explain结果中type列显示为ALL也就是全表扫描rows列预估扫描了上百万行Extra列显示Using filesort。问题让你分析这条SQL慢的原因并给出优化方案。这种题的解题步骤其实非常固定。先看type如果是ALL说明没走索引或索引失效然后看Extra如果出现Using filesort说明排序无法用到索引MySQL需要额外排序再看key列是不是为NULL。至于索引失效的场景笔试里也常考包括对索引列使用函数或运算隐式类型转换LIKE以通配符开头OR连接非索引列条件等。比如WHERE DATE(create_time) 2023-01-01这种写法即使create_time上有索引因为用了DATE函数索引也走不了正确的写法是WHERE create_time 2023-01-01 00:00:00 AND create_time 2023-01-02 00:00:00。4.2 在线变更表结构的学问热搜词里有一个词出现了很多次mysql数据库修改结构。这确实是DBA笔试里的一个知识点而且实际工作中也极容易踩坑。在很多同学的认知里ALTER TABLE加个列不是很简单吗但在千万级甚至亿级数据量的表上直接执行ALTER TABLE ADD COLUMN在MySQL 5.7及之前的版本中通常要拷贝全表数据期间会加MDL锁阻塞读写。如果你的表是线上正在服务的表那这波操作基本等于事故。解法有几个方向笔试里能答出两三个就算不错。第一个是使用gh-ost或者pt-online-schema-change这类工具做在线DDL变更原理是通过触发器或Binlog同步数据到临时表完成后原子切换表名。第二个是MySQL 8.0支持了INSTANT算法对某些操作可以立即完成比如在表末尾加列。第三个是错峰执行在业务低峰期进行变更。笔试中如果遇到这种题记得把思路往减少对业务的影响上靠——是先变更从库再切换主备再变更主库还是用工具在线操作这两种方案分别有什么利弊能答出这个层面阅卷人就知道你真的考虑过线上环境的约束。4.3 主从延迟与数据一致性主从复制几乎是每个互联网公司数据库架构的标配笔试中相关题目必考。常见的问题是主从延迟产生的原因是什么如何监控和处理主从延迟的本质是从库重放主库Binlog的速度跟不上主库写入的速度。常见原因包括从库硬件性能比主库差大事务在主库执行一次而在从库也要重放一次从库上有查询压力或者主库是并发写入而从库是单线程/多线程复制但并行度不够。笔试如果问你怎么解决可以从这几个角度回答一是硬件层面从库规格不低于主库二是从库开启并行复制MTSMulti-Threaded SlaveMySQL 5.7以后支持基于LOGICAL_CLOCK的并行复制8.0还在优化三是业务层面拆分大事务避免一次性更新上百万行四是读流量治理从库只承接可以容忍延迟的读请求关键实时性要求高的读走主库。再往后延伸一点还有半同步复制Semisynchronous Replication的概念主库要等至少一个从库确认收到Binlog才返回事务提交成功以此降低数据丢失风险。还有组复制Group Replication和MGR架构如果笔试里提到了数据一致性和高可用这些概念可以一并带出。4.4 热点词背后的真实考点审计、索引争用与连接池热搜词里有几个词非常值得玩味比如数据库开启审计 引起索引争用和mysql的数据库连接池。这些几乎都是实际运维中才会遇到的问题也侧面说明网易这类公司笔试的出题方向。先说审计与索引争用。数据库开启审计功能后每一次SQL执行都会写入审计日志高并发场景下审计日志的写入会产生严重的锁竞争和IO开销甚至引起BPBuffer Pool和索引页的争用。这类题考的是你是否知道数据库审计是有代价的你能否在合规需求和性能冲击之间做权衡。答题时可以提到审计策略要按需开启尽量只审计关键表和关键操作或者使用专门的审计插件/独立的审计日志存储。再说连接池。笔试中会面到HikariCP、Druid、C3P0这些连接池的对比以及连接池参数怎么设置。核心要理解连接池不是越大越好。连接数过高会导致数据库端线程切换开销增加、上下文切换严重反而降低吞吐。推荐的做法是压测确定最佳值通常中小型应用8~16个连接就够核心高并发应用也是几十到上百的量级而不是几千。Druid在国产技术栈里非常流行笔试里如果提到阿里的技术栈大概率会问到Druid。5. 边界扩展篇国产数据库与新趋势考点5.1 国产数据库走近校招笔试题近几年国产数据库的势头大家有目共睹。热搜词里出现的达梦数据库、人大金仓、GaussDB、OceanBase、TiDB其实都是国产数据库的代表。笔试里虽然不会让你写出某种国产数据库的全部语法但很可能会以选择题或简答题的形式考察你对国产数据库发展趋势的基本了解。以达梦数据库为例它兼容Oracle的很多特性语法也大量兼容Oracle因此学习过Oracle的人上手达梦会非常快。人大金仓KingbaseES则更偏向PostgreSQL生态。GaussDB有分布式版本和集中式版本华为系产品周边经常出现。OceanBase是蚂蚁集团开源的分布式关系数据库TiDB则是PingCAP开源的分布式NewSQL数据库。如果你准备的是校招笔试我建议至少要了解国产数据库和MySQL/Oracle的兼容性差异、分布式数据库的基本架构如TiDB的TiDB Server、PD、TiKV三层架构、以及它们解决的典型痛点如水平扩展、高可用、国产化替代。这些知识在笔试中出现并不突兀反而能体现出你对数据库行业趋势的敏感度。5.2 向量数据库与时序数据库不止是关系型热搜词里有不少新方向比如向量数据库、doris数据库、时序数据库的数据库结构设计。这其实透露了一个信号现代DBA的知识边界早就超出了MySQL/Oracle的范围。向量数据库是这一两年的热点核心解决的是AI场景下的相似向量检索问题比如文本Embedding的相似度搜索、图片特征检索。代表产品有Milvus、FAISS严格来说是向量索引库、Qdrant等。如果笔试中问到向量数据库大概率是考察你是否了解它在RAG检索增强生成或推荐系统中的应用以及向量索引的基本思路比如HNSW、IVF这类近似最近邻搜索算法。时序数据库则是另一个方向代表产品有InfluxDB、TDengine、Prometheus底层TSDB、VictoriaMetrics等。时序数据库的核心特点是高写入吞吐、按时间维度聚合查询、数据生命周期管理。如果笔试中让你设计一个时序库的表结构你至少应该想到时间戳作为分区字段、设备ID/标签作为Tag、指标值作为Field、按时间保留策略做数据压缩。Doris则是现在非常火的国产分析型MPP数据库主要用于OLAP场景。如果笔试里提到Doris考察点大概率在它的架构FE和BE节点、数据模型Unique模型、Aggregate模型、Duplicate模型、以及和MySQL生态的兼容性。把这些扩展知识放进来不是说让你每个方向都精通而是想提醒大家数据库管理工程师这个岗位的笔试范围越来越宽。你真正需要具备的是自顶向下的通识和自底向上的原理。5.3 笔试之后从校招到DBA的成长路径走到这一步不管笔试结果如何我已经把数据库管理工程师这个岗位的考察逻辑想得非常清楚了。笔试只是第一关但它的指向性极其明确你想做数据库方向就要有管理一个甚至一群数据库的视角。从准备笔试到后续面试我的建议是建立一个自己的数据库知识树。树干是关系型数据库的核心机制——存储引擎、事务、锁、索引、日志、复制。树枝是不同类型的数据库产品——MySQL、PostgreSQL、Oracle、Redis、ES、TiDB、OceanBase、ClickHouse每种都有自己的适用场景。树叶是具体的技术细节——参数配置、慢查询优化、备份恢复、监控告警、高可用架构。具体到面试准备我复盘后认为这几个方面值得重点投入第一把MySQL源码级别的热点机制看透一轮。虽然校招生不要求有源码贡献经验但如果你能讲清楚一条SELECT语句从客户端到服务端再到存储引擎的完整执行流程讲清楚一条UPDATE语句在InnoDB中经历了哪些日志和缓冲区的交互面试官会觉得你的底子很扎实。第二亲手做几次故障演练。自己在本地搭一套MySQL主从环境把主库的Binlog模拟误删数据后的恢复过程跑一遍把慢查询日志调出来分析一遍把连接数打爆再排查一遍。没有亲手做过这些操作面试时说到故障排查心里是虚的。第三阅读大厂的数据库实践总结。像网易云音乐、美团、阿里云、字节跳动的数据库团队都有不少对外分享从真实案例中能学到很多笔试和面试中不会直接出现但实际很容易踩坑的细节。我个人在准备这场笔试的过程中最大的收获其实不是背下了多少知识点而是被迫建立了一个全局视角。以前写业务代码数据库就是一个连接串现在看数据库我会想它是如何在一台台服务器上组织数据、管理并发、保证一致、扛住流量的。这个转变比拿到任何一个offer都值。如果你正在准备数据库管理工程师的校招我想说不要被那些海量的知识点吓到也不要只盯着一本《高性能MySQL》死磕。把笔试当作一次数据库体检它会诚实地告诉你你在哪个层面还欠着火候。补上了你就离这个岗位上岗更近了一步。