感觉也算是数据库入门了 以及 随想

不知道从啥时候开始研究DB的。。。好像就这个学期??
当时软件工程课程要选一个项目,我们4个人,有一个大佬已经写了一个解释器,老师说不能直接交上学期的解释器项目,然后我就想要不要写个DB出来(也不知道当时怎么想的),把这个解释器作为sql parser,然后我写存储引擎之类的。(当时应该说是只懂一些基本原理,但是内部构造实现之类的完全没经验。。。也不知道哪来的自信)
然后写了几周,写出来个这玩意:xjbDB设计文档
一开始我是照着cmu15-445的project看,但没有cmu vpn,没办法拿到所有资料,也就大概看了看BufferPoolManager 和 DiskManager。然后花了一些时间来写 HashLRU,这个是从levelDB学来的。然后咸了几周(做了些mit6.824和看论文),因为不懂存储引擎怎么写,因为还要落盘,还要从disk load 到 memory,然后就去看《SQLite Database System Design and Implementation》,大概翻了一遍,才知道原来可以这样组织数据,然后开始写Page,B+Tree,刚开始写B+Tree的时候差点自闭了,因为 sqlite 上面说 Root 是 internal,但是怎么看都不对劲,后来自己魔改了,才写出来。隔了一周才敢测试,发现没什么bug还挺兴奋的。之后就开始处理逻辑层的工作,sqlite 的 VM执行bytecode,我们也不懂怎么搞 code gen,所以还是 parse sql 成一个 operator tree 来解释执行。VM我不怎么懂,就真的xjb写了,因为当时比较急,所以很多基础服务都没有做好,VM层真正还不错的我觉的也就是 VirtualTable了。存储引擎层的基础服务做的还不错,包括page层的服务,除了有一点:我把所有的 memory allocation 交给 new了,其实应该自己管理,但是没经验,就这样吧。大概花了几天把增删改查功能实现了之后,才意识到好像就结束了,但其实这部分实现非常丑陋。然后就是期末各种事情,这个项目也告一段落。
这回因为没有经验,写完存储引擎,发现怎么搞concurrency control呀?B+tree是拿着锁下去的,不会让你先找到位置,再拿锁。导致我连2PL都写不来。现在才知道原来锁是放在另一个table里。
其实最大的两个难点应该就是 query process 和 concurrency control 了,其他的做法基本固定,除了存储可以分row-store和 column-store,不过列存我还没研究过。
最近看了一些论文,对 query process 和 concurrency control 也算有了些认识,勉强算是入门吧(离入门十里)

其实明显可以感觉到,这些理论说起来容易,真要让我一个人实现,还是一头雾水。。。
之前写存储引擎,都是把整个流程在大脑里不断地跑,最终成型之后才敢写。像concurrency control这种,看起来理论不算难,但去思考实现的话,真是复杂到爆炸,各种细节,内存管理,引用计数,原子操作,回滚,尤其是很多模块间并不是黑箱,而是要暴露很多实现细节出去,还得维护很多protocol。真希望啥时候能把整个 concurrency control 的流程在大脑中成型,要不然总感觉哪里不对劲之类的。
而且很多 concurrency control 的方法都不太一样,虽然只是些细节不同,但是其实这会对存储引擎造成很大的入侵,或者说这一大坨本来就是一起的,一点细节不同,就可能影响很多实现的trade-off。

最近打算看一些DB,OS和体系结构的论文,因为要准备保研夏令营,没写过论文,就只能多看看了。。
报了4个学校(按想去的顺序):上交,计算所,北大,复旦
还是想继续读书。。。但是听说教育部把硕士砍了很多,,当然如果能进比较好的组,博士也可以考虑
如果没学上了,就得去秋招找工作了,,好惨。。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值