感覺也算是數據庫入門了 以及 隨想

不知道從啥時候開始研究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個學校(按想去的順序):上交,計算所,北大,復旦
還是想繼續讀書。。。但是聽說教育部把碩士砍了很多,,當然如果能進比較好的組,博士也可以考慮
如果沒學上了,就得去秋招找工作了,,好慘。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章