最近我把MySQL又写了一遍,总共写了三遍了,今天聊聊我的感受和一些学习方法。
十多年前,当我还是一个青涩的应届生时,所在公司的老板是做IT出身的,有一次聊天他告诫我说:“要想提升自己的技术水平,可以先从优秀的开源项目开始学习,然后尝试自己去写一个。”
我信了,现在回头想想,幸好当时我信了,从而让我走上了一条与众不同的技术路线,人生的转折有时就在一瞬间,信,是一条路,不信,是另外一条路。
此后十多年,我研究了Spring、SpringBoot、Spring Cloud、RabbitMQ、Tomcat、Dubbo、Zookeeper、SpringAI、LangChain、MetaGPT、GraphRAG...等源码,同时也手写了Spring、SpringBoot、Tomcat、Dubbo、Seata等Java领域的多个优秀的开源框架,但大多都局限在了Java。
被现实困住的我们,至少要实现思想上的自由吧,难道我只能研究Java领域的技术?那当然不是!
我之前其实也研究过一些JVM、Linux的源码,但是被中断了,而这一次,我想好好研究一下MySQL源码,并手写一个MySQL,哪成想,我竟然把MySQL写了三遍!
为什么是MySQL?答案很简单,软件架构中最重要的就是数据库,数据库中最经典的就是MySQL!把MySQL研究透,上能设计出更优秀的架构,下能深入数据库内核开发,中能吊打面试官,唯一的缺点就是,难!
MySQL是用C++开发的,但难的并不是C++,或者说对于任何一个项目而言,语法都不是难点,就像大家自己在做的项目一样,难的是那些代码到底在实现什么样的业务,难的逻辑,是细节。
很多人问我研究源码的方法是什么,为什么自己研究源码的时候很难,我想来想去,我似乎也没有什么特殊的秘籍,无非就是官网、资料、源码、debug,硬要说一个方法,那就是热爱和坚持!
那为什么要手写MySQL,并且写三次呢?
先给大家看看我手写MySQL的工程目录:

包括以下核心功能,麻雀虽小但五脏俱全:
表的创建和表空间实现
主键索引B+树的生成
辅助索引B+树的生成
新增记录和查询记录
走索引、全表扫描、覆盖索引
order by、group by、count、join
内存排序、文件归并排序
事务、redolog、logbuffer、bufferpool
行锁、间隙锁、插入意向锁的加锁和解锁
...
以下是部分代码截图


第三版在第二版的基础上优化了某些实现并增加了事务和锁相关的内容。
以下是行锁的实现效果演示:
有过开发经验的同学应该都有这种感受,如果一个需求让你重新实现一遍,肯定会实现得比上一次更好,事实上,重构是提高软件质量非常有效的一种方式,因此,我把MySQL重写了三次,并且每次都有新的收获。
有人可能会问,为什么要手写MySQL呢?造轮子有意义吗?
如果编程是门课,那么这门课最好的教材是优秀项目的源码,最好的老师是优秀项目的开发者,最好的实践便是造轮子,研究源码不仅能积累更多、更正确的技术知识,更重要的是能领悟更多、更优秀的编程思维模型,同样的问题,不同的思维模型,最终给出的解决方案是不一样的,而思维模型往往需要更成功的、水平更高的大佬来告诉你,现实中如果遇不到这样的牛人,那就可以通过造轮子来达到,同样的需求,看看你是如何实现的,大佬是如何实现,从而改善自己的思维模型。
另外,通过手写MySQL也能让跟着我学MySQL源码的学员们更容易理解MySQL的底层实现机制,站在教学的角度,手写是教底层最好的一种方式,手写MySQL是一个化繁为简的过程,不能说取其精华去其糟粕,因为MySQL源码中处处是精华,大家如果想学我的《手写MySQL+MySQL源码解析》课程可以联系我,可以给大家最大的优惠。

最后我想说,失败并不是成功之母,成功才是,小成功是大成功之母,学习也好,创业也好,踏出第一步很重要,第一步成功更重要,当然,古之成大事者,不惟有超世之才,亦必有坚忍不拔之志,想要成为一个技术大牛,并不需要你有很高的智商,但一定需要你有坚韧不拔的品质,最后祝大家早日成为技术大佬!
感谢大家的观看,文末附《手写MySQL+MySQL源码解析》课程的大纲图,感兴趣的联系我(dadudu6789),有优惠,先到先得





