1. 浩鲸2020届数据库笔试的整体画像与出题逻辑
前阵子整理移动硬盘,翻出当年存的一份资料,标题写着"浩鲸科技2020届数据库A卷"。浩鲸科技这个公司,行业内一般叫它浩鲸,前身是中兴软创,后来阿里云和西班牙电信入股,名字也改成了浩鲸科技。它的主要业务集中在电信行业BSS/OSS系统、政企数字化转型,这类业务的特点就是数据量大、流程复杂、系统要7x24小时稳定跑着,所以它对数据库相关岗位的要求,跟纯互联网公司不完全一样。
翻完这份A卷,我的第一感觉是:它考察的方向非常贴合浩鲸的业务场景。卷子里不是那种纯背概念就能拿分的题目,也不是那种特别偏门、炫技的算法题,而是把重点放在了"你在实际系统里到底会不会用数据库"这件事上。电信运营商的计费系统、客户关系系统、订单中心,这些系统每天要处理千万甚至亿级的流水数据,表结构动辄上百个字段,SQL写得不讲究,轻则接口超时,重则把核心表锁死,导致整个业务链路瘫痪。所以浩鲸这类公司笔试,特别爱考三层东西:一是事务并发控制,二是索引和SQL优化,三是数据一致性与备份恢复。
从题型分布看,这份卷子大致分成几块:单选题大概覆盖数据库基本概念、SQL语法、事务特性;多选题和判断题专门挖坑,考察对细节的理解;简答题集中在索引底层原理、死锁、隔离级别;大题是SQL编写和数据库设计。整体难度中等偏上,但它好在";"——它考察的是你的数据库思维是否成型,而不是你背了多少条命令。
再看2020届这个时间点,那年数据库圈子的风向已经很明显了:MySQL是主流应用,Oracle在传统行业依然有大量存量,PostgreSQL开始抬头,国产数据库还在积蓄力量。这份卷子也确实体现了这种格局:MySQL和Oracle的内容占大头,SQL标准语法必须熟练,同时对数据库基础理论的考察很扎实。我见过不少候选人,刷了几百道LeetCode式的SQL题,一碰到"为什么这个SQL走了全表扫描"就懵了,因为他的学习路径里根本没有"理解优化器怎么工作"这一环。这份卷子恰恰就是在筛选这样的人。
2. 高频考点热词盘点:从热搜词看命题侧重
把题目跟最近数据库方向的热搜词对照着看,会发现一个有意思的现象:当年卷子里的核心知识点,跟现在社区里大家讨论最多的问题,高度重合。像"数据库增删改查""数据库死锁""索引优化""数据库同步工具""数据库设计""国产数据库"这些词,在当年的笔试卷和现在的面试题里都是高频词,只是侧重点和考察深度不同。
2.1 增删改查:不是送分题,是陷阱题
很多人觉得增删改查是入门内容,但这份卷子里的相关题目恰恰说明,越是基础的东西越能拉开差距。比如它考了一道这样的题:一张订单表里没有主键,只有几个普通索引,要把某条记录的状态字段从1改成2,问这个UPDATE语句在InnoDB存储引擎下会发生什么。不少人第一反应就是"把那条记录改一下",但实际执行逻辑是:InnoDB会根据条件扫描索引,找到对应的聚簇索引记录,先对记录加X锁,然后修改,同时生成UNDO日志,如果表上有二级索引,还要同步更新二级索引。如果你没有主键,InnoDB会使用第一个非空唯一索引,如果连这个都没有,它会在后台生成一个6字节的ROWID作为隐式主键。这一系列动作,少想一步,后面的索引维护、锁竞争、复制延迟都可能出问题。
再比如它问你"DELETE和TRUNCATE有什么区别",这个题几乎年年有,但它不满足于让你回答"一个是删行一个是清表"。它会继续追问:TRUNCATE能不能回滚?在什么隔离级别下,两个并发事务分别对同一张表执行DELETE和TRUNCATE,会发生什么?这就把思考维度从语法层面拉到了事务和元数据锁层面。我建议所有准备笔试的人,把增删改查背后涉及的锁、日志、索引维护逻辑都过一遍,而不是只背SQL写法。
2.2 死锁:笔试必考,但几乎没人能讲透
数据库死锁是这个圈子永远的热搜词,也是这份卷子的重点。它考的方向很实在:给你两个事务的SQL序列,让你判断会不会死锁,死锁发生在哪一步,MySQL是如何检测和处理的。这类题说白了就是考你"锁的兼容矩阵"和"加锁顺序"这两个概念有没有真正理解。
举个例子,表结构是t(id PK, user_id, amount, KEY idx_user(user_id)),事务A先执行 UPDATE t SET amount=amount+10 WHERE user_id=100;,事务B先执行 UPDATE t SET amount=amount+20 WHERE user_id=200;,然后A再执行 UPDATE t SET amount=amount+5 WHERE user_id=200;,B再执行 UPDATE t SET amount=amount+15 WHERE user_id=100;。这两个事务在最低的读已提交隔离级别下是不会死锁的,因为每条语句执行完就释放了不匹配条件的记录锁;但如果在可重复读下,间隙锁和临键锁的存在会让死锁发生概率显著提高。这道题考的就是你有没有意识到隔离级别对加锁范围的影响,很多人只在背"RR解决幻读"这个结论,却不知道RR为了杜绝幻读引入了临键锁,而这恰恰是大量死锁的来源。笔试复习到这个层次,才算过关。
2.3 数据库同步与迁移:业务系统里躲不开的必修课
热搜词里有"数据库同步软件""数据库同步工具",当时这份卷子没直接考工具名,但它问了"主从复制延迟怎么解决""binlog有哪些格式、各自有什么优缺点",本质就是在考察同步机制的理解。主从复制延迟这个问题,在电信行业尤其严重,因为浩鲸的系统里经常有大批量报表任务,一个大的聚合查询跑在从库上,直接把从库CPU打满,主从延迟瞬间飙到几秒甚至几十秒,前端运营人员的工单列表就一直转圈。
试卷里给出的场景很典型:一个主库两个从库,其中从库A承载报表查询,从库B承载线上业务的读流量,某天从库A延迟急剧升高,让你分析原因并提出方案。通常的排查链路是:先看从库的SQL线程状态,确认是不是有一条大事务在回放,然后看IO线程是否正常,确认主库的binlog有没有及时传到从库的中继日志里,最后看从库的硬件指标,确认是不是磁盘IO或CPU遇到了瓶颈。解决方案不外乎并行复制、把大查询拆小、用独立的备库做报表。如果笔试里能写出从"现象定位"到"根因分析"再到"解决方案"的完整链路,这题的得分会明显高于只写"加并行复制"的人。
3. 事务、隔离级别与MVCC:这份卷子最深的理论区
3.1 事务ACID没那么简单:它考察的是每个特性的实现机制
关于事务的考察,这份卷子不走"背出四个特性"这条路,它反着来:告诉你一个具体的故障场景,问你事务的哪个特性保障了数据最终一致。比如,一个转账事务把钱从A账户扣掉,结果还没来得及给B账户加钱,数据库进程崩溃了,重启后数据是什么状态?这考的是原子性,但追问一句"原子性是通过什么机制实现的",答案指向UNDO日志和回滚段。再比如,某事务在可重复读下两次查询同一行数据,第二次查询读到了自己被修改过的值,这算不算隔离性问题?很多人纠结,其实这完全正常,因为一个事务自己的修改当然对自身可见,它不符合脏读的定义,因为脏读指读到了别的未提交事务的修改。
ACID这个概念如果不落到"具体由哪个组件和哪种日志保障"的层面,遇到这种变体题很容易翻车。我给自己的复习原则是:每背一个概念,必须用一句话说清楚它对应的底层实现。原子性对应UNDO,持久性对应REDO,隔离性对应锁和MVCC,一致性是这个系统所有机制配合的最终结果。这四个点串起来,事务类题目基本能覆盖八成。
3.2 隔离级别之间的边界:脏读、不可重复读、幻读的精确差异
这份卷子在隔离级别上出了不止一道题,而且全是场景判断题。脏读、不可重复读、幻读这三个现象,看起来是三条定义,实际上考的是你能不能识别一段SQL时序里到底发生了哪种现象。我见过很多人把不可重复读和幻读混在一起,其实核心区别在于:不可重复读针对的是同一条记录的两次读取结果不一致,幻读针对的是同一个范围的两次查询返回了不同数量的行。
卷子里有个经典反例:在可重复读隔离级别下,事务A先SELECT了某个范围的数据,事务B往这个范围插入了新记录并提交,事务A再次SELECT时居然没看到新记录,于是用UPDATE把范围内所有旧记录的某个字段改了。由于快照读和当前读的机制差异,事务A其实把事务B插入的那条新记录也锁住了。这个现象在MySQL的InnoDB下叫做"半一致读",如果题目不点破,特别容易让人以为可重复读彻底解决了幻读。事实上InnoDB是靠临键锁和间隙锁在索引层面阻止了新记录插入到范围内,才实现了真正意义上的可重复读下无幻读,但这种实现方式也不是无条件的,它只在使用了正确的索引访问路径时才有效。
3.3 MVCC的快照读与当前读:为什么你的快照读看不到别人已提交的数据
MVCC是事务部分的核心,也是这张卷子拉开分数的地方。它用了一道题来考快照读和当前读的区别:一个事务在可重复读下做了一次普通SELECT,之后另一个事务提交了新数据,再之后这个事务里再执行一条UPDATE语句,发现它能更新到刚才别人提交的那条记录,问为什么。这道题直击MVCC的机制本质:普通SELECT是快照读,用的是事务开始时的ReadView;UPDATE、DELETE、SELECT FOR UPDATE是当前读,读的是最新已提交版本并加锁。可重复读下快照只生成一次,所以快照读不会看到新数据,但当前读不会受这个限制。
这个知识点在实际系统里的影响非常深远。业界的经验是:在一个事务里别先做快照读再做当前读,除非你明确知道自己在干什么。否则你基于快照读的结果去更新数据,很容易产生逻辑上的数据不一致。比如一个事务里先SELECT余额是100,然后业务判断余额足够就执行UPDATE,但实际上另一个事务已经把这个余额改成50了,你的UPDATE当前读会把50加锁并改掉,而你业务层判断用的数据还是100。这就是典型的并发更新问题,如果业务上不允许这种情况,就要在事务一开始就用SELECT FOR UPDATE把锁加上。
4. 索引与SQL优化:笔试大题的必争之地
4.1 索引底层原理:B+树为什么能统治关系型数据库
浩鲸这份A卷的索引部分,没有一上来就考B+树,而是从"什么场景下索引失效"切入,再问到"为什么最左前缀原则会存在"。但如果你不懂B+树的结构,这两道题都答不透。B+树跟其他树结构最大的区别在于三点:数据只存在叶子节点,叶子节点之间用链表相连,非叶子节点只存索引键和指针。这个设计让它在磁盘IO场景下特别占优,因为树的层高很低,三层B+树就能存千万级别的数据,查询一个记录只需要几次磁盘IO。同时叶子节点链表让范围查询非常高效,从小到大扫一遍就行。
MySQL默认的InnoDB引擎,索引组织方式是聚簇索引,主键的B+树叶子节点直接存整行数据,二级索引叶子节点存的是主键值,所以通过二级索引查数据需要回表:先查二级索引得到主键,再回聚簇索引找整行。这个机制解释了为什么主键要尽量用自增整数,因为如果主键是UUID这种随机字符串,每次插入新记录时B+树都要大量分裂调整,性能很差。索引失效的问题也大多要从这个结构去理解:条件列上做函数操作,相当于你把B+树里存的键值都改了一遍,树本身的结构没法用了,优化器只能放弃索引走全表扫描。
4.2 从执行计划反推SQL写法:EXPLAIN到底在看什么
笔试里的大题直接给了一条慢SQL的EXPLAIN输出,让你指出问题并优化。这张表的EXPLAIN结果里,type列是ALL,Extra列是Using where,意思是全表扫描,没有用到任何索引。优化方向一般分两步:第一步看WHERE条件、ORDER BY、GROUP BY涉及的列,看看能不能建联合索引;第二步看SELECT的列是否在索引里,如果只查几个列,可以考虑覆盖索引避免回表。
但真实业务里很少这么简单。比较典型的坑是:你给一张表建了联合索引(company_id, status, created_at),然后有一个查询条件是WHERE company_id=? AND created_at BETWEEN ? AND ?,这时候最左前缀原则要求必须从company_id开始,created_at是第三个列,而中间跳过了status,那这个B+树最多只能利用company_id这一列来定位,created_at的过滤是在回表后逐行进行的。所以正确做法是让联合索引的列顺序跟查询条件的过滤粒度对齐:区分度高的列放前面,范围查询的列放最后。这个"区分度和列顺序"的问题,在所有数据库笔试题里都属于高频中的高频。
4.3 一条具体慢SQL的优化全过程:从全表扫描到覆盖索引
卷子最后的大题里有这么一条:SELECT id, user_id, amount FROM payment WHERE status=0 ORDER BY create_time DESC LIMIT 50;。表里数据量是2000万行,status=0的记录占比大概40%。如果直接在status上建索引,比例太高,优化器依然会选择全表扫描,因为扫描索引后再回表的成本比全表扫还高。如果不建索引,每次执行就是全表扫描加filesort,耗时大概2秒多。
我当时给的优化思路是:把查询改成覆盖索引。建一个联合索引(status, create_time, id, user_id, amount),让查询需要的所有列都在索引里,这样就不需要回表,而且由于status用了等值条件,create_time可以在索引内有序排列,LIMIT 50只要顺着索引往前扫50条就行。这条SQL从2秒降到了几十毫秒,效果非常明显。但这个方案也有代价:每次INSERT、UPDATE都要维护更大的索引,写入性能会下降。所以笔试里如果你能把优化方案和代价分析都写出来,得分会比只写"建索引"高一个档次。
5. 数据库设计的实操维度:不只画ER图那么简单
5.1 三大范式的工程取舍:规范化与反规范化的平衡点
数据库设计部分,卷子出了个需求:一个简单的订单系统,要求设计订单表、订单明细表、商品表。表面上是考察建表能力,实际上考察的是范式理解和业务场景的权衡。订单系统这种OLTP场景,通常要遵守第三范式,把客户信息、商品信息、订单信息拆开,避免数据冗余,因为冗余会导致更新异常和一致性风险。
但如果你做过电商或电信计费系统,就会知道订单表往往存了商品名称的快照字段,而不是统统去联表查商品表。原因很简单:商品名称和价格可能变,但订单快照里的信息不能被历史变更影响。这就是一种有意为之的反规范化设计。笔试中问"是否允许冗余"时,如果能答出"冗余的目的是用空间换时间,且必须通过应用层保证冗余字段和源数据的一致性",这个回答会体现出工程经验。
5.2 主键策略:自增ID、UUID还是分布式ID
这张卷子还考了主键选择。自增ID在单机数据库里性能好,但分库分表后会出现重复或需要改造主键的问题。UUID适合分布式环境生成,但作为InnoDB聚簇索引主键时会导致页分裂严重,写入性能下降。所以现在业界的主流做法是使用雪花算法或类似的分布式ID生成器,既能保证全局唯一、趋势递增,又不会像字符串型UUID那样破坏索引结构。
笔试答这类题,不要只罗列优缺点,要结合场景给出结论。比如浩鲸这类电信BSS系统,全国有多个分中心,每个分中心都有独立的数据库,客户ID如果各库自增,合并到总部就会撞主键。这时候引入分区键加上雪花ID是常见方案。你答出这个层次,阅卷人会知道你真的处理过分库分表的数据合并问题。
5.3 从ER图到物理建表:字段类型与约束的细节
试卷里还要求根据业务描述设计表和字段类型。这里有个容易被忽略的细节:DECIMAL和FLOAT的区别。在涉及金额的场景,必须用DECIMAL,因为FLOAT和DOUBLE是浮点数,二进制的表示方式天然无法精确表示所有十进制小数,做加减乘除会产生精度误差。电信计费全是钱,分毫都不能差,所以金额字段务必用DECIMAL(10,2)这种定点数类型。
还有字符集和排序规则的选择。如果表里涉及到中文等多语言字符,必须用utf8mb4而不是utf8,因为MySQL的utf8只是utf8mb3的别名,最多存3字节,像emoji这种4字节字符会存不进去。排序规则方面,如果你对大小写不敏感,可以用utf8mb4_general_ci或utf8mb4_unicode_ci,具体差异是unicode_ci的排序更符合Unicode标准,但性能略慢。这些细节是实践中最常踩的坑,笔试也特别容易出判断题。
6. 周边生态与技术趋势:工具链和国产数据库的进场
6.1 数据库管理工具的选型:命令行之外的另一条腿
热词里有"dbx数据库工具""db browser for sqlite""navicat""数据库管理工具"这些词,说明大家对数据库的使用离不开工具链。但我想借此说一个观点:工具是放大器,你的SQL能力和数据库原理理解才是基础。你用图形化工具连接数据库,点一下执行,看到的只是结果集,背后执行计划怎么走的、走没走索引、锁等待多少毫秒,这些信息才是优化SQL的关键。所以我个人建议在笔试备考阶段,尽量用命令行去操作MySQL或PostgreSQL,多用EXPLAIN、SHOW ENGINE INNODB STATUS这类命令,逼自己养成看原始信息的习惯。等原理都通了,再用图形化工具提高日常效率也不迟。
对于SQLite的加密问题,比如热搜里有"db browser for sqlite 怎么打开加密的数据库",答案是SQLite本身没有内置加密,常见的是SQLCipher。SQLCipher是SQLite的加密扩展,通过256位AES加密整个数据库文件,要打开它必须用支持SQLCipher的客户端并提供密钥。这个场景在移动端和小型桌面应用中非常常见,笔试如果问你"数据库文件怎么保证安全",这其实是一个很好的思路。
6.2 从Oracle到人大金仓、达梦:国产数据库的迁移与适配
2020年之后国产数据库的势头越来越猛,热搜词里"达梦数据库""人大金仓数据库docker""gaussdb"频繁出现,说明这个领域已经是事实上的行业热点。达梦数据库在架构上兼容Oracle的很多语法和特性,存储过程、包、游标等都有对应实现,所以从Oracle迁移到达梦的成本相对低一些。人大金仓(KingbaseES)则更偏PostgreSQL系,它的SQL语法、JSON支持、扩展机制跟PostgreSQL很像,所以如果你熟悉PostgreSQL,上手KingbaseES会很顺。GaussDB是目前讨论度比较高的分布式数据库,它跟openGauss同源,在华为云生态里地位非常高,很多政企客户在做核心系统改造时都会评估它。
这类数据库的笔试题,往往不会直接考你用某种国产数据库写SQL,而是考"迁移方案怎么设计"。比如从Oracle迁移到达梦,需要处理几个关键差异:一是数据类型映射,VARCHAR2、NUMBER、DATE这些要对应到达梦的类型;二是内置函数差异,NVL、DECODE、ROWNUM这些Oracle特有的函数要改成达梦支持的写法;三是分页查询,Oracle用ROWNUM,达梦也兼容了ROWNUM,但如果迁移目标是PostgreSQL系的KingbaseES,就要改成LIMIT和OFFSET。这些跨数据库迁移的细节,笔试如果考到,是真正拉开经验差距的题。
6.3 数据库同步工具与MCP生态:新的连接方式
数据库同步这块,热词里"数据同步软件""数据库同步工具""workbuddy通过mcp直接访问数据库"非常亮眼。MCP(Model Context Protocol)是最近很火的协议,它让AI助手可以通过标准化的方式去访问外部数据源。比如WorkBuddy这类工具通过MCP连接数据库后,业务人员就能用自然语言向AI提问"查一下上个月订单量排名前十的商品",AI会把问题转成SQL,查询数据库后把结果返回给用户。这套东西看起来神奇,但底层依然是数据库的连接管理、SQL执行、结果集处理这些基本功。如果连基本的SQL都写不明白,工具再好也帮不了你。
数据库同步工具的实际场景,更多还是在主从复制、双活数据中心、异构数据库迁移这些层面。现在常用的开源同步工具,比如Canal、Debezium、DataX、Flink CDC,各有侧重。Canal主要监听MySQL的binlog,把变更日志导入到消息队列或者其他存储,用来做缓存更新、异构同步、数据归档。Debezium是通用的CDC框架,支持MySQL、PostgreSQL、Oracle、SQL Server等,配合Kafka Connect使用,可以构建实时数据管道。DataX是阿里开源的离线同步工具,适合大数据量的批量导入导出。Flink CDC则把实时同步和流式计算结合在一起,可以在同步的过程中做清洗转换。笔试或面试时,如果你谈数据同步,能把"在线补数用DataX、实时流同步用Canal或Debezium、复杂加工用Flink CDC"这个选型逻辑讲清楚,基本就是加分项了。
7. 按照这份卷子倒推的备考路线与答题节奏
7.1 先把"核心五件套"吃透再刷题
做数据库笔试备考,很多人一上来就疯狂刷SQL题,但数据结构没吃透,刷再多也容易卡壳。根据浩鲸这份A卷的考点分布,我建议的复习顺序是:第一,事务与隔离级别,重点是ACID的底层实现、四种隔离级别、MVCC机制、锁分类和死锁。第二,索引原理,重点是B+树结构、聚簇索引和二级索引、回表、覆盖索引、索引失效场景、执行计划。第三,SQL语法与调优,重点是增删改查的细节、聚合函数、子查询、JOIN的底层原理和适用场景、LIMIT分页的深层优化。第四,数据库设计,重点是范式、主键策略、字段类型选择、字符集、约束设计。第五,备份恢复与高可用,重点是binlog、redo log、undo log的区别与作用、主从复制、集群架构、数据迁移。
这五块内容,每一块都要能形成"概念定义-底层机制-典型场景-常见坑点-实战优化"的完整闭环。做到这个层次,不管是浩鲸还是其他公司的数据库笔试,大概率都能应付。
7.2 考场上的答题顺序和时间分配
这份卷子的题量不算大,但陷阱多,所以我建议先快速扫一遍所有题目,把简单的概念题和SQL语法题先做掉,把需要深度推理的题目留到后面。一般来说,选择题和判断题控制在20分钟以内,简答题控制在30到40分钟,SQL大题和数据库设计题留足40分钟。如果一道题想了三分钟还没有明确思路,先跳过,别在单题上死磕。
SQL大题特别容易失分,是因为候选人只写了主SELECT语句,漏了索引设计、数据初始化、边界情况处理。我的习惯是:写SQL之前先花30秒在草稿上确认表结构和数据关系,写完之后再花30秒检查WHERE条件里有没有列上做了函数处理、JOIN的关联列有没有索引、ORDER BY有没有配合索引顺序。这些检查动作虽然简单,但能有效避免最常见的低级错误。
7.3 我踩过的坑:笔试里最容易被扣分的四个细节
第一个坑是分页查询的深翻页。LIMIT 100000, 20看起来很简单,但MySQL要扫过前面的100000条记录再扔掉,代价很高。笔试题如果给一个大数据量的分页场景,答案就不能只有LIMIT,要想到游标分页、延迟关联、或者把排序字段改成覆盖索引里的列。
第二个坑是COUNT()和COUNT(列名)的区别。COUNT()统计的是所有行数,COUNT(某列)统计的是该列非NULL的行数。在MySQL里COUNT(*)经过优化后性能反而比COUNT(1)更好,这在很多人的认知之外,笔试判断题经常拿这个做文章。
第三个坑是UPDATE语句的WHERE条件没走索引。一旦全表扫描,InnoDB会给所有扫描到的行加锁,哪怕最终不更新的行也加了锁,这会放大锁范围,严重时直接把整张表锁住。在InnoDB里,DELETE和UPDATE的加锁范围跟WHERE条件的索引选择性强相关,如果选择性差,锁的范围就可能大得离谱,这在线上是重大事故级别的隐患。
第四个坑是字符集不一致导致的隐式转换。两个表关联字段如果一个是utf8一个是utf8mb4,MySQL会在比较时把utf8转成utf8mb4,这个转换会导致该字段上的索引失效。笔试中很容易出这种细节判断题,项目里也是特别折磨人的问题。
8. 如何把这些经验转化成你自己的知识体系
最后说点比较个人的体会。数据库这个东西,知识点非常多,但底层逻辑其实是相通的。你理解了页和B+树,就理解了为什么索引快、为什么主键用自增、为什么select最左前缀失效;你理解了日志和锁,就理解了为什么事务需要隔离级别、为什么死锁和主从延迟会发生。所以我不建议大家分散地去记零散的知识点,而是建议每学一个概念,都问一句"它是为了解决什么问题而存在的",这样你的知识就是一张网,而不是一堆碎片。
浩鲸这份2020届数据库A卷,放到现在看,考察的核心能力依然没有过时。相反,随着数据量变大、系统越来越复杂,数据库基础能力的重要性反而更高了。我见过太多只会写CRUD、一遇到数据库性能问题就束手无策的开发人员,也见过不少能把一条慢SQL优化到毫秒级、能把整个数据库迁移方案讲得明明白白的工程师,后者的成长路径通常都有很扎实的底层原理做支撑。
如果你正在准备数据库方向的笔试或面试,我的建议很简单:别急着刷题,先把MySQL的InnoDB存储引擎、事务、索引、日志这几块内容通读一遍,然后对照着这篇文章里的考点,一个一个过,确保每个点都能用自己的话讲清楚,并且能举出实际例子。这个基本功打好了,后续你去看Oracle、PostgreSQL、达梦、GaussDB这些,会发现很多概念是相通的。
最后分享一个小技巧。我复习时有个习惯:每学完一个知识点,就在一张卡片上画一个小型场景图,包含表结构、SQL语句、执行过程、结果。比如学完MVCC,就画一个事务A和事务B读写冲突的快照读场景;学完死锁,就画一个两条UPDATE互相等锁的时间线。这些卡片攒到一定数量后,我在面对笔试场景题时,脑子里会迅速匹配到对应的卡片,答题速度和准确率都明显提升。这个办法你也可以试试,比闷头看书刷题高效得多。