MySQL 在软件测试面试里,权重一直不低。不管你是面功能测试还是测开,SQL 基础、索引原理、事务隔离级别、甚至死锁排查,都可能是面试官手里的“常规牌”。尤其这两年行业里卷得厉害,光会 select * from table 已经糊弄不过去了,面试官一张嘴就是“你平时怎么排查慢 SQL”“RR 隔离级别下到底有没有幻读”“左边 LIKE 为什么走不了索引”。这些坑我都踩过,也有不少朋友反馈问来问去就那些高频点。这篇我把 2026 年软件测试面试里 MySQL 相关的核心题目、背后的原理、以及回答的思路一次说清,顺便把我在面试别人和被别人面时积累的一些经验放进去,希望能帮你少走点弯路。
1. 面试官考 MySQL,到底在考什么
1.1 测试岗位为什么非要问数据库
很多准备面试的朋友一开始有个误区:我是做测试的,数据库只要会写 SQL 能查数就行了,问那么多底层原理干什么?
这么想就低估面试官的目的了。测试岗位问 MySQL,通常不是在考你背了多少命令,而是在验证三个维度。
第一个维度是数据校验能力。功能测试、接口测试都离不开数据的前后置校验,比如注册一个新用户、提交一笔订单,你需要去数据库确认数据落库是否正确、状态位有没有翻转、金额字段有没有精度丢失。这些工作拼的其实就是 SQL 基本功,写不写得出来、能不能快速定位数据差异,直接影响测试效率。面试官通过“给你个场景你用 SQL 怎么查”就能看出你平时的测试习惯。
第二个维度是问题定位能力。线上出了问题,测试往往是第一波排查的人。如果日志显示数据库报错或者接口超时,你连 show processlist 都不知道看,连 explain 都不会用,那定位效率会非常低。面试官想从你嘴里听到的是“我先看是不是慢 SQL,再看锁等待,再查连接数”——这个完整的排查链路。
第三个维度是知识深度。测试工程师写 SQL 是基础,懂索引原理和事务隔离级别才是区分度。尤其做测开或者高级测试,免不了要设计测试数据、构建数据工厂、做性能测试,这些场景都绕不开对 MySQL 内部机制的理解。面试官通过追问“为什么”“还能怎么优化”来判断你是会背题还是真懂。
1.2 测试视角和开发视角的差异,得分点在哪
研发岗位面 MySQL,重点在写法和调优能力;测试岗位面 MySQL,一定要把问题往“验证”“发现缺陷”“构造场景”这几个方向上靠。
举个例子,面试官问“MySQL 的隔离级别有哪些”,开发回答往往停在“读未提交、读已提交、可重复读、串行化”这个列表上。但测试如果能接一句“我在测试并发下单场景时,会把隔离级别调整到读已提交来模拟线上配置,验证是否会因为不可重复读产生订单金额不一致的 bug”,这样回答的含金量完全不同。
这其实就是测试岗位面试 MySQL 的得分密码:每一个知识点都要能连到一个你真实做过的测试场景上。因为面试官真正想确认的不是你知不知道,而是你会不会用。备考的时候可以刻意做一个转换训练——每复习一个 MySQL 知识点,脑子里过一遍“这个知识点在测试里能用来发现什么缺陷”,能接得上,这个知识才算真的变成你的加分项。
2. 必背基础题:SQL 操作与测试中常见的坑
2.1 增删改查背后容易被追问的细节
不管面试题包装成什么样,最后都会落到增删改查上。但面试官不会直接问“insert 怎么写”,而是给一个场景让你说思路。比如:
“测试一个用户注册功能,注册成功后需要校验哪些数据?用 SQL 怎么写?”
这种题看似基础,但考察点非常细。首先你要说清楚校验思路:先查用户主表确认基本信息,再查扩展信息表或者日志表确认关联数据,还要检查状态字段是不是预期值。SQL 写出来就是 select * from user where phone = 'xxx',然后逐步扩展。
这里有个容易忽略的坑:部分面试者会习惯性写 select *,面试官可能追问“线上表数据量大,select * 有什么问题”。这时候要说清楚两点,一是多余的字段传输浪费 IO 和带宽,二是如果表结构有调整,select * 的隐性影响不容易被发现。在测试环境的造数脚本里可以偷懒,但面试时最好主动说出“我会只查需要的字段,比如 select id, status, create_time”。
update 操作也是高频考点。最典型的一个问题:你怎么安全地修改测试数据?很多初级测试会直接写 update user set status = 1 where name = 'xxx',面试官反手一个追问“要是 name 不唯一怎么办”。
正确的回答思路是:先用 select 确认影响范围,再执行 update,最后再用 select 验证。如果要修改的数据必须精确定位,优先用主键 id 作为 where 条件。这个习惯在测试环境无所谓,但如果你在线上环境做数据订正,漏写 where 条件导致全表更新——那是事故级别的错误。面试官非常喜欢用这个场景吓唬人,就是为了考察你有没有数据操作的安全意识。
delete 的坑更多。曾经有个候选人跟我说他清测试数据用 delete from order_info,我追问“清完后自增主键怎么办?数据量很大时这个操作有什么问题?”他就愣住了。这里至少要能说出来两点:一是 delete 不会重置自增 ID,你要用 TRUNCATE 才能重置;二是大表 delete 会锁很多行、产生大量 binlog,甚至拖垮主从同步,这种操作应该分批删除或者和开发确认归档方案。
2.2 排序、分组、去重的几个隐藏陷阱
排序是功能测试里验证列表展示顺序时最常用到的能力。面试题喜欢给一个商品表的场景:查出每个分类下价格最高的商品。
初级答法是用 group by 分类 + max(price),这种写法能查出最高价,但拿不到这个最高价商品的其他字段。如果需求是“把每个分类下价格最高的那件商品完整信息列出来”,正确做法是窗口函数或者关联子查询。MySQL 8.0 支持窗口函数,可以用 row_number() over (partition by category order by price desc) 实现,这已经是当前的主流解法。面试官看你说出窗口函数,基本就会默认你的 SQL 功底在平均水平以上。
分组查询还有一个必踩的坑是 ONLY_FULL_GROUP_BY 模式。在这个模式下,select 的字段必须都在 group by 里出现过,或者被聚合函数包住。比如:
select user_id, max(amount) from payment group by user_id;这条语句没问题;但如果还想 select payment_time,就会直接报错。面试官拿这个当考题的时候,本质是想确认你理解 SQL 的逻辑执行顺序和分组语义,而不只是会抄语句。
再说 DISTINCT。面试题常见的是“统计一个用户表里去重后的城市数量”,这种用 select count(distinct city) from user 就行。但要注意 DISTINCT 是对整行去重而不是单列去重,很多人写 select distinct city, age 以为只在去重 city,其实是 city 和 age 的组合去重。测试校验数据的时候,如果没搞清楚这个语义,很容易误判数据。这个细节值得主动说出来,属于小知识点但很能体现功底。
还有一个排序的经典问题:order by 的字段有 NULL 值时,默认排序规则是什么。MySQL 里 NULL 在升序时排最前,降序时排最后。测试排序功能时如果不注意这个规则,用例设计就会有缺失。面试能主动提到“我在设计排序用例时会专门补 NULL 值和空字符串的用例”,绝对是加分回答。
3. 进阶重点:索引原理与 SQL 性能分析
3.1 为什么 MySQL 选 B+ 树,索引怎么就失效了
索引几乎是 MySQL 面试的必考大项,无论你是测试还是开发。最常见的连环问题是:索引的底层数据结构是什么?为什么用 B+ 树不用哈希表?什么是聚簇索引?最左前缀原则是什么?哪些操作会导致索引失效?
先说数据结构。InnoDB 的索引底层是 B+ 树,哈希索引在 InnoDB 里是自适应哈希索引,不是我们能主动指定的主要结构。B+ 树的优势很好记:数据都存在叶子节点,并且叶子节点之间用双向指针串联,这样范围查询非常高效。你可以用查字典来类比:B+ 树相当于一本有目录、有页码、而且每一页结尾还有指向下一页的箭头,你不仅能快速翻到某个字,还能顺着箭头一路翻下去。
哈希索引的问题也顺带解释清楚:它能做等值查询,但做不了范围查询,因为哈希后顺序完全丢失。所以 InnoDB 默认选择 B+ 树作为主索引结构,这是由业务查询场景决定的。
索引失效是面试官最爱追的题。常见的失效场景列一下,每一条都要能说原理:
- 对索引列使用函数或表达式,比如 where YEAR(create_time) = 2024,索引会失效,因为 B+ 树里存的是原始值,不是函数计算结果。
- 隐式类型转换,比如 varchar 字段不写引号 where phone = 13800001111,MySQL 会做类型转换,索引失效。
- 左模糊查询,比如 where name like '%张三',因为 B+ 树只能从左边开始匹配,前面的百分号让优化器没法利用索引。
- or 连接非索引列,比如 where id = 1 or status = 1,如果 status 没索引,那整个查询可能要全表扫描。
- 联合索引不满足最左前缀,比如索引是 (a, b, c),查询条件是 b = 1 and c = 2,a 没出现,索引失效。
这些知识对测试同样很有用:设计数据库相关的测试用例时,你可以故意构造索引失效的查询,验证慢 SQL 监控能否被触发;做性能测试时也要注意,模拟线上真实查询模式,避免测试时 SQL 都走索引、上线后却因为写法不同全部全表扫描,导致性能数据失真。
建议再记一个实用小技巧:用 explain 关键字看执行计划时,关注 type 列。从好到差依次是 system、const、eq_ref、ref、range、index、ALL。ALL 就是全表扫描,通常意味着这条 SQL 需要优化。测试人员只要会看这个,就能在测试阶段提前发现慢 SQL 风险。
3.2 explain 阅读心法:测试人员怎么快速定位慢 SQL
面试里经常给一段慢 SQL,问你如何排查。完整回答链路应该是:先开慢查询日志确认是哪些 SQL,然后 explain 看执行计划,重点看 type 和 key 字段,再看 rows 估算扫描行数,如果有必要可以做 explain analyze 拿真实执行时间。
拿一个常见的慢查询举例:
select * from order_info where user_id = 12345 order by create_time desc limit 10;如果 explain 之后发现 type 是 ALL,key 是 NULL,rows 是几十万,那问题就清楚了:user_id 没有索引,导致每条查询都要扫全表。解决方案很简单,给 user_id 加个普通索引。
如果 user_id 已经有索引,但 extra 列出现 using filesort,就说明 order by create_time 没走索引,MySQL 在排序上花了额外时间。这时可以建联合索引 (user_id, create_time),让排序也可以走索引。
这里有一个面试官常设的坑:他会问“加了联合索引 (user_id, create_time) 之后,where user_id = 12345 order by create_time 会走索引吗”。答案是会,而且是最优的索引利用方式。但如果查询条件变成 where create_time > '2024-01-01' order by user_id,那联合索引大概率帮不上排序,因为最左前缀原则要求排序字段前的等值条件存在。
测试人员还要额外注意 explain 里的 rows 不是精确值,是估算值,基于采样统计。如果统计数据不准确,rows 会和实际差异很大,遇到这种情况可以执行 analyze table 更新统计信息。线上环境操作前记得确认变更窗口和权限。
3.3 为什么我建议测试也要会看索引基数
索引基数(cardinality)这个点,面试考的概率不高,但在你做测试造数时非常实用。简单说,基数是指索引列上不同值的数量。基数太小,比如性别字段只有男和女两种值,MySQL 优化器可能直接放弃索引选择全表扫描,因为回表成本比扫全表还高。
测试造数的时候如果你把所有订单的状态字段都置为“已支付”,这个列的索引基数就是 1,之后性能测试跑出来的结果根本不能代表真实线上情况。正确做法是让测试数据的高散列字段尽量贴近真实分布,比如状态字段要有不同取值、金额字段要有不同大小区间。
这个经验我是真的踩过坑。有一年我们测一个订单查询接口的性能,测试环境状态字段全是 1(已支付),结果压测单接口 TPS 高得吓人,上生产之后接口响应直接翻倍。查下来发现生产环境的订单状态分布很散,索引选择路径完全不同。面试的时候如果能讲出这个亲身经历,比背十遍“索引基数”概念都管用。
4. 事务、锁与隔离级别:测试必须吃透的并发知识
4.1 四个隔离级别到底怎么区分,幻读和不可重复读的区别
事务隔离级别是 MySQL 面试的分水岭。初级答案是把四个级别背出来,中级答案是说清楚各自解决的问题,高级答案是用测试场景验证每种隔离级别可能引发什么缺陷。
四个级别按隔离强度从低到高排列:
- 读未提交:一个事务可以读到另一个事务未提交的数据,脏读由此产生。
- 读已提交:只能读到已提交的数据,解决脏读,但同一事务内两次读同一数据可能结果不同,产生不可重复读。
- 可重复读:事务开始后读取的数据一直保持一致,解决不可重复读。InnoDB 默认级别就是这个,它通过 MVCC 和间隙锁进一步解决了幻读问题。
- 串行化:事务完全串行执行,读写相互阻塞,隔离性最强但并发性能最差。
不可重复读和幻读容易混。我习惯用一个场景帮大家区分:订单状态从“待支付”变成“已支付”,同一个事务里查两次,第二次结果变了,这是不可重复读,重点在“同一行数据的值变了”;同样的事务里第一次查只有 10 条订单,第二次查冒出第 11 条,这是幻读,重点在“查询结果集的行数变了”。
测试人员在设计并发测试用例时,这个区分非常关键。如果你想验证超时关单功能,就需要构造不可重复读的场景;如果你想验证秒杀活动库存扣减有没有超卖,那就要关注幻读,多个事务同时插入同一类数据时是否会互相影响。
还有一点容易被面试官挖:MySQL 默认隔离级别是可重复读,但 Oracle 默认是读已提交。不少公司线上会用读已提交,所以测试环境要照着生产配置来,不能想当然用默认值。这个细节说出来,显得你真的做过环境对齐。
4.2 锁的分类:共享锁、排他锁、间隙锁与死锁排查
锁的知识是事务隔离级别之后的必追问题。先分清共享锁和排他锁,也就是 S 锁和 X 锁。select 默认不加锁,但如果加了 lock in share mode 就加共享锁,多个事务可以同时持有共享锁;如果加 for update 就加排他锁,其他事务的读写都会被阻塞。
接着是行锁、表锁和间隙锁。InnoDB 默认支持行锁,但如果 where 条件没走索引,行锁可能升级成表锁,这是非常经典的坑。比如你在一个没有索引的字段上做 update,MySQL 为了锁住匹配行不得不锁全表,并发瞬间就降下来了。所以大表更新的前提永远是“先确认走索引”。
间隙锁是 InnoDB 解决幻读的重要手段。举个例子:事务 A 执行 select * from order where id between 10 and 20,如果这个范围里有间隙,MySQL 会锁住这个间隙,事务 B 想往这个间隙里插入数据就得等待。间隙锁在可重复读级别下默认开启,在读已提交级别下基本失效。
死锁的排查是测开和高级测试的高频考察点。面试官通常会出一个场景:两个事务互相持有对方需要的锁,然后问你如何定位。
我建议的回答包括四步:
- 第一步,通过 show engine innodb status 查看最近一次死锁信息,里面会明确打印两个事务各持有什么锁、在等待什么锁,以及被回滚的事务。
- 第二步,分析事务里的 SQL 加锁顺序,找代码里对资源加锁的先后顺序是否一致。比如事务一先锁 A 再锁 B,事务二先锁 B 再锁 A,这种就是典型的交叉死锁。
- 第三步,确认执行计划里 where 条件是否走了索引,防止行锁升级成表锁导致锁范围扩大。
- 第四步,和开发讨论优化方案,比如统一加锁顺序、缩小事务范围、调整索引,必要时把大事务拆成多个小事务。
我实际面试候选人的时候,只要对方能主动说“先用 show engine innodb status 定位”,我就会觉得这个人是有真实排查经验的,因为光背理论的人根本不知道这个命令的存在。
4.3 测试人员怎么用锁的知识设计并发用例
并发测试用例设计是测试面试的加分环节。知识掌握了,还要会转化成测试设计。
举例来说,秒杀场景要验证超卖,你设计的用例至少包括:两个事务同时读取库存,然后都执行扣减,看最终库存是否变成负数。这时候你心里要清楚,如果没有行锁保护,两个事务可能都读到库存为 1,然后都扣成 0,逻辑上没问题,但实际上只发了一件商品却出了两单。
再比如模拟死锁的测试用例:故意让两个并发请求以不同的顺序更新两张表,执行一段时间后看数据库是否有死锁报错。这种用例在功能测试阶段就要跑出来,不能等线上出了问题才去处理。
还有一个经验:测试环境最好开启并监控死锁日志。MySQL 有以下参数可以配置,比如 innodb_print_all_deadlocks,开启后所有死锁都会记录到错误日志里。测试过程中如果出现死锁,你能第一时间拿到现场的锁等待信息,而不是事后靠猜。
5. 测试场景专项:存储过程、常用命令与数据准备
5.1 存储过程在测试数据准备里的实战用法
很多人面试被问到存储过程就紧张,觉得这是开发的内容。其实测试人员掌握存储过程的基本用法,对测试数据准备和批量操作非常有帮助。
最典型的使用场景是构造大量的测试数据。比如你需要压测一个分页查询接口,要往订单表里插入 100 万条数据,一条条 insert 是不可能完成的任务。写一个存储过程循环插入,效率能提升几十倍。基础写法大概长这样:
delimiter // create procedure init_order_data() begin declare i int default 1; while i <= 1000000 do insert into order_info(order_no, user_id, amount, status, create_time) values(concat('TEST', i), i mod 10000, rand() * 1000, i mod 5, now() - interval i second); set i = i + 1; end while; end // delimiter ;这里有几个细节要注意。第一个是 delimiter 切换,MySQL 默认用分号作为语句分隔符,而存储过程内部有大量分号,所以要先改成 //,结束再改回来。第二个是造数要尽量模拟真实分布,user_id 不要每个都不一样,而是用取模的方式让一部分用户有多个订单,这样才能测出索引和分页查询的真实性能。第三个是金额不要用固定值,用 rand() 生成随机分布,避免所有行数据高度相似导致索引基数失真。
面试官如果问“存储过程和普通 SQL 比有什么优缺点”,至少要说出来:优点是减少网络传输、封装复用逻辑、批量处理效率高;缺点是调试困难、版本管理不方便、存储过程里的逻辑错误定位起来比应用代码麻烦。测试人员在工作中主要是拿它做造数工具,而不是在业务里大量写存储过程。
5.2 高频 MySQL 命令速查:测试排查必备清单
测试人员排查环境问题、定位数据异常,真正高频用到的 MySQL 命令其实就那么几个。我整理了一份自己平时常用的清单,面试前可以对照过一遍。
| 命令 | 使用场景 | 关键点 |
|---|---|---|
| show processlist | 查看当前连接和执行中的 SQL | 注意 Time 列,执行时间过长就是慢 SQL 的线索 |
| show engine innodb status | 查看死锁和锁等待信息 | 重点看 LATEST DETECTED DEADLOCK 字段 |
| explain + select | 分析 SQL 执行计划 | 看 type、key、rows、extra 四个字段 |
| show variables like 'xxx' | 查看参数配置 | 比如事务隔离级别、慢查询日志开关 |
| show index from 表名 | 查看表上的索引信息 | 确认联合索引顺序和区分度 |
| select @@tx_isolation | 查当前隔离级别 | 8.0 中变量名是 transaction_isolation |
| show create table 表名 | 查看建表语句 | 快速确认字段类型、默认值、索引设置 |
| analyze table 表名 | 更新表统计信息 | 当 explain 的 rows 严重失真时使用 |
这套命令面试前最好熟练到不用思考就能打出来。面试官经常会现场给你一个“线上慢查询”场景,能正确说出排查链路的人,通常直接进入下一轮。
还有一个测试专属场景:环境数据不一致时怎么办。测试组往往有多套环境,你排查数据问题时第一步要做的就是确认你连的是哪个库哪个环境,这个听起来简单,但实际踩过太多坑了。我认识一个测试,排查了半天发现连的是生产库,差点造成数据变更事故。面试时如果能讲出这种安全意识细节,会让面试官很放心。
5.3 测试数据准备和清理的最佳实践
数据准备和清理是测试日常里最容易被低估、但面试官很爱问的环节。比如“给你一个新增优惠券的活动,你怎么准备测试数据”。
我习惯把数据准备分成三层来回答。第一层是基础数据,比如用户、商品、店铺,这些是业务的前置条件;第二层是业务数据,比如优惠券模板、活动配置,这些直接决定被测功能的输入;第三层是边界数据,比如快要过期的优惠券、库存只剩一件的商品、金额为 0 的订单,这类数据专门用来触发边界条件。
清理数据的原则是“谁创建谁清理,清理要彻底”。测试执行完要能还原环境,不然会影响下一轮测试甚至其他同事的执行结果。清理方法可以是在插入数据时记录主键或唯一标识,然后按条件删除;也可以用事务包裹测试数据操作,最后 rollback 回滚。不过注意 DDL 语句是不能回滚的,存储过程里如果你创建了临时表,要记得 drop temporary table。
面试官如果追问“测试数据如何不和开发数据互相干扰”,比较好的回答是多环境隔离 + 数据标识隔离:可以约定测试数据统一使用某个前缀或特定 user_id 段,方便识别和清理;如果条件允许,独立测试库是最干净的方案。
6. 高频面试题速查与避坑经验清单
6.1 软件测试岗位 MySQL 高频题一览
把前面讲的内容浓缩成一张面试题速查,建议按这个方向过一遍:
- 一条 SQL 的执行流程是什么样的?
- char 和 varchar 的区别?text 和 blob 呢?
- 什么是事务的 ACID 特性?
- 隔离级别有哪些?InnoDB 默认是什么?
- 什么是脏读、不可重复读、幻读?举例说明
- MVCC 是什么?undo log 和 redo log 分别有什么用?
- 聚簇索引和非聚簇索引的区别?
- 什么是最左前缀原则?能举一个联合索引失效的例子吗?
- 为什么 like '%xxx' 不走索引?
- explain 里 type 字段的常见取值有哪些?
- 怎么排查一条慢 SQL?
- 什么是共享锁、排他锁、间隙锁?
- 死锁怎么定位和解决?
- group by 和 having 的区别?
- count(*) 和 count(字段名) 有什么区别?
- 存储过程是什么?测试里怎么用它造数据?
- 主从复制是什么?binlog 有什么用?
- 一张大表做分页,深分页怎么优化?
每个问题最好能结合自己真实的测试场景准备一个 2 分钟左右的回答,太短显得没料,太长容易跑偏。
6.2 面试回答时的三个原则
回答 MySQL 技术问题时,我建议掌握三个原则:先结论、再原理、最后举例。
先结论的意思是,第一句话直接回答问题,比如“这条 SQL 不走索引,因为对索引列用了函数”。不要绕弯子铺垫半天,面试官时间有限,他要快速判断你的思维是否清晰。
再原理的意思是,紧接着把原因说透,让面试官知道你理解机制而不是背答案。继续上面的例子:“B+ 树索引存储的是列原始值,对列使用函数后,MySQL 无法直接利用索引树查找,只能全表扫描”。
最后举例是收尾,举一个测试中的实例来证明你用过。比如:“我之前做活动列表性能测试时,发现 RPA 执行慢 SQL,explain 一看就是对 create_time 用了 date_format 导致索引失效,后来改成范围查询就好了。”
这“三件套”回答方式,比单纯背知识点更像一个有经验的从业者。面试是交流不是考试,你表现得越像一个日常干活靠谱的人,通过率越高。
6.3 备考时值得避免的三个雷区
第一个雷区是只看概念不动手。MySQL 的知识点非常依赖实操记忆,光看文章记不住细节。建议本地装一个 MySQL 5.7 或 8.0,把上面提到的 SQL 都亲手跑一遍,explain 也亲眼看一下。比如你只有真跑一次左侧 LIKE 的 explain,才会深刻理解 type=ALL 和 type=range 的差别。
第二个雷区是忽略版本差异。这些年 MySQL 版本演进挺快的,5.7 和 8.0 在窗口函数、默认字符集、账号加密规则上都有差异。面试时可别把 8.0 的东西说成 5.7 的默认功能,反过来也一样。建议明确知道自己简历项目里用的是哪个版本,并顺带熟悉它的关键特性。
第三个雷区是只会写不会讲。测试面试里你不仅要写对 SQL,还要能在白板或者在线文档上边写边讲思路。平时练习时可以把解释过程读出来,模拟面试场景,避免现场紧张导致表达混乱。我见过不少候选人 SQL 写得没问题,但一被追问就逻辑断层,非常可惜。
7. 最后分享一点我的经验体会
做了这么多年面试官,我最大的感受是:MySQL 的问题从来不缺储备量大的候选人,缺的是能把知识落到实际工作场景里的人。
你不需要把 MySQL 所有文档都背下来,但一定要把你简历里写过的项目跟 MySQL 知识牢牢绑在一起。比如你做电商项目,就准备秒杀并发、库存扣减、订单分页查询这些场景;你做内容平台,就准备用户表设计、评论列表分页慢、点赞去重这类场景。面试官问到任何一个 MySQL 问题,你都能顺着自己的项目讲出真实案例,这个效果远胜于背一百道题。
另外提一句,测试岗位面试 MySQL,回答时记得经常把话题往“我怎么用这个知识去测”“我在测试时发现了什么问题”上引。这能让面试官清楚地感觉到你是个测试思维很强的人,而不是一个半路出家的开发。说到底,面试考的不是你会多少,而是你来了能不能直接用这些知识把活儿干漂亮。