<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数据库学习资料 on roseduan</title><link>https://blog.roseduan.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/</link><description>Recent content in 数据库学习资料 on roseduan</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 13 Apr 2024 10:51:56 +0800</lastBuildDate><atom:link href="https://blog.roseduan.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/index.xml" rel="self" type="application/rss+xml"/><item><title>超级硬核的数据库/分布式存储学习路线</title><link>https://blog.roseduan.cn/p/%E8%B6%85%E7%BA%A7%E7%A1%AC%E6%A0%B8%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93/%E5%88%86%E5%B8%83%E5%BC%8F%E5%AD%98%E5%82%A8%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/</link><pubDate>Sat, 13 Apr 2024 10:51:56 +0800</pubDate><guid>https://blog.roseduan.cn/p/%E8%B6%85%E7%BA%A7%E7%A1%AC%E6%A0%B8%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93/%E5%88%86%E5%B8%83%E5%BC%8F%E5%AD%98%E5%82%A8%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/</guid><description>&lt;p&gt;我自己就是从业务自学转入数据库内核研发岗位的，根据自己的经历，简单总结了一下入门数据库/存储相关的学习路线、学习资料、项目书籍推荐等，大家可以参考。&lt;/p&gt;
&lt;p&gt;并且需要强调的是，这些内容其实并不只是为了想要转入数据库/存储方向的同学。&lt;/p&gt;
&lt;p&gt;就算是业务后端开发，以及云原生等方向，数据库、分布式都是必备的基础内容，并且存储也能够学习到很多的一些操作系统基础知识，所以我觉得都是有必要去进行学习的。&lt;/p&gt;
&lt;h2 id="必看课程"&gt;必看课程
&lt;/h2&gt;&lt;p&gt;CMU-15445 和 CMU-15721&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.youtube.com/@CMUDatabaseGroup" target="_blank" rel="noopener"
&gt;https://www.youtube.com/@CMUDatabaseGroup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这两个不用多说，经典的数据库入门教程，由数据库的大佬 Andy Pavlo 亲自授课。&lt;/p&gt;
&lt;p&gt;可以了解到数据库的基本概念，例如存储、BufferPool 缓冲池、索引、优化器、执行器、事务等。&lt;/p&gt;
&lt;p&gt;15445 的实验部分是基于其开源的教学项目 &lt;a class="link" href="https://github.com/cmu-db/bustub" target="_blank" rel="noopener"
&gt;bustub&lt;/a&gt;，补全其中几个重要的部分，这个项目是 C++ 写的，如果对 C++ 不熟悉的话，那么我觉得实验部分可以暂时跳过，有多余的精力再来搞，毕竟我们是来学数据库的，而不是学 C++ 的。&lt;/p&gt;
&lt;h2 id="存储项目实践"&gt;存储项目实践
&lt;/h2&gt;&lt;p&gt;学习数据库课程的同时，顺便可以了解下存储方面的内容，存储是数据库必不可缺的重要组成部分。&lt;/p&gt;
&lt;p&gt;例如 B+ 树、bitcask、LSM Tree，以及 LSM Tree 的优化 Wisckey，找几篇文章看看，了解下基本概念，或者直接看看对应的最权威的论文。&lt;/p&gt;
&lt;p&gt;然后自己去实践写一个，例如写一个简单的 bitcask、B+ 树存储引擎，或者 LSM 存储引擎。&lt;/p&gt;
&lt;p&gt;在我的经验看来，这几类存储引擎，实现的难度大致是 B+树 &amp;gt;= LSM &amp;gt; bitcask，bitcask 可以看做是一个简化版的 LSM Tree。&lt;/p&gt;
&lt;p&gt;对于 B+ 树，学习的资料有&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/etcd-io/bbolt" target="_blank" rel="noopener"
&gt;BoltDB&lt;/a&gt;，Go 语言写的一个 B+ 树单机存储引擎，在生产环境中广泛应用&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cstack.github.io/db_tutorial/" target="_blank" rel="noopener"
&gt;https://cstack.github.io/db_tutorial&lt;/a&gt;，一个简单的从零开始写数据库的教程，类似 SQLite，C 语言实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LSM Tree，可以参考以下资料&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/google/leveldb" target="_blank" rel="noopener"
&gt;leveldb&lt;/a&gt;，Google 开源的单机存储引擎，Go 语言也有一个对应的实现 &lt;a class="link" href="https://github.com/syndtr/goleveldb" target="_blank" rel="noopener"
&gt;goleveldb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/dermesser/leveldb-rs" target="_blank" rel="noopener"
&gt;leveldb-rs&lt;/a&gt;，Rust 实现的 leveldb&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/skyzh/mini-lsm" target="_blank" rel="noopener"
&gt;mini-lsm&lt;/a&gt;，一个从零实现极简的 LSM 教程，Rust 实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;bitcask 可参考资料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/rosedblabs/rosedb" target="_blank" rel="noopener"
&gt;rosedb&lt;/a&gt;，基于 bitcask 的单机 KV 引擎&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/rosedblabs/mini-bitcask" target="_blank" rel="noopener"
&gt;mini-bitcask&lt;/a&gt;，一个极简的 bitcask 教程&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之所以推荐写存储类的实战项目，主要是因为存储层的 KV 一般比较好实现，同时又能够了解到一些数据库的基本设计理念。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;强烈推荐👍🏻&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果想要一个完整实现 KV 存储的代码实践教程，可以参考我的&lt;a class="link" href="https://w02agegxg3.feishu.cn/docx/Ktp3dBGl9oHdbOxbjUWcGdSnn3g" target="_blank" rel="noopener"
&gt;《从零实现 KV 存储》&lt;/a&gt;的教程，从第一行代码开始的视频实战教程，使用 Go 和 Rust 两种语言分别实现。&lt;/p&gt;
&lt;h2 id="事务mvcc"&gt;事务/MVCC
&lt;/h2&gt;&lt;p&gt;这部分网上的资料比较多，可以看看事务的一些基本概念 ACID，然后看看如何去实现的，可以借鉴其他数据库例如 MySQL、PostgreSQL，关于事务实现原理分析这方面的文章比较多。&lt;/p&gt;
&lt;p&gt;概念了解差不多之后，可以自己动手实现，例如可以在自己写的存储项目的基础上，加上事务的功能，保证事务原子性、隔离性，以及并发读写的性能，自己上手撸肯定比只了解理论好很多。&lt;/p&gt;
&lt;p&gt;CMU 15445 和 15721 课程都讲到了事务的一些基本概念，可以参考 &lt;a class="link" href="https://15445.courses.cs.cmu.edu/fall2019/schedule.html#oct-23-2019" target="_blank" rel="noopener"
&gt;https://15445.courses.cs.cmu.edu/fall2019/schedule.html#oct-23-2019&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其他的一些部分，例如 parser、执行器、优化器、向量化等等，比较复杂，自己从头搞一个的难度比较大，我觉得可以简单看看资料，了解一下基本概念，工作之中再针对性的查漏补缺。&lt;/p&gt;
&lt;p&gt;当然如果你对某个部分特别感兴趣的话，比如优化器之类的，也可以多去了解然后自己实践，我这里推荐存储和事务的实现，是因为相对来说比较容易上手。&lt;/p&gt;
&lt;p&gt;其他方面的项目实践这里也推荐一些资料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go 语言实现的 sql 解析器 &lt;a class="link" href="https://github.com/xwb1989/sqlparser" target="_blank" rel="noopener"
&gt;https://github.com/xwb1989/sqlparser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TiDB 的 mysql 解析器 &lt;a class="link" href="https://github.com/pingcap/tidb/tree/master/pkg/parser" target="_blank" rel="noopener"
&gt;https://github.com/pingcap/tidb/tree/master/pkg/parser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rust 实现的 sql parser &lt;a class="link" href="https://github.com/sqlparser-rs/sqlparser-rs" target="_blank" rel="noopener"
&gt;https://github.com/sqlparser-rs/sqlparser-rs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Meta 开源维护的通用数据库执行框架 Velox &lt;a class="link" href="https://github.com/facebookincubator/velox" target="_blank" rel="noopener"
&gt;https://github.com/facebookincubator/velox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;向量化执行框架 Arrow &lt;a class="link" href="https://github.com/apache/arrow" target="_blank" rel="noopener"
&gt;https://github.com/apache/arrow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="分布式"&gt;分布式
&lt;/h2&gt;&lt;p&gt;这部分内容首推 MIT 6824（现已改名为 6.5840），分布式系统入门的首选课程。
&lt;a class="link" href="https://www.youtube.com/@6.824/videos" target="_blank" rel="noopener"
&gt;https://www.youtube.com/@6.824/videos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有精力的话可以跟着把实验部分做完。lab 是实现一个除成员变更之外的 raft 共识算法，并且基于 raft 实现一个容错的分布式 KV 系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;强烈推荐👍🏻&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果对课程内容并不熟悉的话，初次上手做 lab 可能会比较痛苦，并且自己搞也可能会比较浪费时间。&lt;/p&gt;
&lt;p&gt;可以看看我的&lt;a class="link" href="https://av6huf2e1k.feishu.cn/docx/JCssdlgF4oRADcxxLqncPpRCn5b" target="_blank" rel="noopener"
&gt;《从零实现分布式 KV》&lt;/a&gt;教程，从零开始，基于 6824 的 lab，写一个基于 raft 的分布式 KV，教程内容完全涵盖了 6824 的 lab 部分。&lt;/p&gt;
&lt;p&gt;这个学完了之后，可以挑战下 PingCAP 的 talent plan 中的 TinyKV，它和 6824 的实验部分比较类似，实现一个基于 raft 的分布式 KV 存储系统，难度会比 6824 更大，lab 的代码框架是现成的，只需要往里面添加内容即可，测试也比较完备。
&lt;a class="link" href="https://github.com/talent-plan/tinykv" target="_blank" rel="noopener"
&gt;https://github.com/talent-plan/tinykv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果还有时间的话，可以再上一个台阶，挑战下 PingCAP talent plan 的 TinySQL 项目，主要是实现一个简单的分布式数据库项目，有完备的文字教程，只是难度略大。
&lt;a class="link" href="https://github.com/talent-plan/tinysql" target="_blank" rel="noopener"
&gt;https://github.com/talent-plan/tinysql&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="工作或者实习"&gt;工作或者实习
&lt;/h2&gt;&lt;p&gt;当然，其实最好的办法，还是能够直接参与到工作实践当中，这样学习起来是最快的，可以向 leader 请教，和同事交流等。&lt;/p&gt;
&lt;p&gt;如果自身又没有太多经验的话，可以试试那些愿意接纳转数据库内核的公司，这可能会要求你有其他亮眼的东西了，比如基础比较扎实，折腾过自己的项目之类的。能把上面提到的这些东西认真学习下，完成个 60% 左右，我觉得应对一些面试就应该没有太大的问题了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;为了帮助你更高效的学习，我还整理了一份数据库开发的学习资料，数据库的各个方面都涉及到了，例如 SQL、优化器、执行引擎、存储等等，包含一些优质的书籍、论文、视频课程、博客等，还有一些优质的教学类项目。
&lt;img src="https://camo.githubusercontent.com/4d559f25f16588c737455a3e0ef293f9c7e5d4085c8475cbff19490c240160b3/68747470733a2f2f63646e2e6e6c61726b2e636f6d2f79757175652f302f323032332f706e672f31323932353934302f313637333737303833333133302d64383065616363632d366663652d346532332d626463352d3562303064316262333834662e706e6723617665726167654875653d25323365636563656326636c69656e7449643d7566613530653835362d323132302d342666726f6d3d7061737465266865696768743d3734362669643d756133306461626631266f726967696e4865696768743d31343932266f726967696e57696474683d31373030266f726967696e616c547970653d62696e61727926726174696f3d3126726f746174696f6e3d302673686f775469746c653d66616c73652673697a653d323936323135267374617475733d646f6e65267374796c653d6e6f6e65267461736b49643d7537623030623161612d626438372d343862372d393334662d6539636135333664623831267469746c653d2677696474683d383530"
loading="lazy"
alt="image.png"
&gt;
总计十几页的 PDF，一次性送给你，方便提升学习效率。
&lt;img src="https://camo.githubusercontent.com/1758e56cf059161d67d04602e1a83fca6bfe87a016536d6f31ab01fa259c5872/68747470733a2f2f63646e2e6e6c61726b2e636f6d2f79757175652f302f323032332f706e672f31323932353934302f313637333737303731343532382d66633563643433642d353463362d346337662d386338612d6230653831303666646633652e706e6723617665726167654875653d25323366376637663726636c69656e7449643d7566613530653835362d323132302d342666726f6d3d7061737465266865696768743d3631352669643d756638316333636361266f726967696e4865696768743d31323330266f726967696e57696474683d31323934266f726967696e616c547970653d62696e61727926726174696f3d3126726f746174696f6e3d302673686f775469746c653d66616c73652673697a653d333231303832267374617475733d646f6e65267374796c653d6e6f6e65267461736b49643d7563613864393737302d373164662d343739312d396166362d6133636461643464373633267469746c653d2677696474683d363437"
loading="lazy"
alt="image.png"
&gt;
还有一些关于数据库方面的优质 PDF 书籍，可以参考学习：
&lt;img src="https://camo.githubusercontent.com/88267862b5c3e2e8a8b8e59e3def0689b29a96450a905278f4643eeb125cef68/68747470733a2f2f63646e2e6e6c61726b2e636f6d2f79757175652f302f323032332f706e672f31323932353934302f313637353137353430323734332d66353938373333382d643637652d346330642d613537342d3963316137663734336361302e706e6723617665726167654875653d25323364626438636626636c69656e7449643d7536383631303534632d663864632d342666726f6d3d7061737465266865696768743d3435312669643d753462353362353230266f726967696e4865696768743d393032266f726967696e57696474683d31363832266f726967696e616c547970653d62696e61727926726174696f3d3126726f746174696f6e3d302673686f775469746c653d66616c73652673697a653d383937373535267374617475733d646f6e65267374796c653d6e6f6e65267461736b49643d7536623434636634362d336338372d346334302d626535662d6437643536313632646331267469746c653d2677696474683d383431"
loading="lazy"
alt="image.png"
&gt;
&lt;strong&gt;这份学习资料 PDF 和所有的书籍都可以在我的公众号领取&lt;/strong&gt;，后台回复关键字&lt;strong&gt;数据库&lt;/strong&gt;。
&lt;img src="https://camo.githubusercontent.com/4c859b7968361fb91bda33df464ced0ec30d2f54495b53b36c335820b3921d66/68747470733a2f2f63646e2e6e6c61726b2e636f6d2f79757175652f302f323032332f706e672f31323932353934302f313637353231363731333638322d61336361623666372d393363612d343639392d393939642d3232336261373763626339372e706e6723617665726167654875653d25323365396536646326636c69656e7449643d7539306330653939372d313838312d342666726f6d3d75692669643d753666396239636435266f726967696e4865696768743d373632266f726967696e57696474683d32383030266f726967696e616c547970653d62696e61727926726174696f3d3126726f746174696f6e3d302673686f775469746c653d66616c73652673697a653d323630323736267374617475733d646f6e65267374796c653d6e6f6e65267461736b49643d7530376466376365612d643934382d346634382d393235372d3763633334373739653132267469746c653d"
loading="lazy"
alt="Snipaste_2023-02-01_09-58-05.png"
&gt;&lt;/p&gt;</description></item></channel></rss>