網(wǎng)站制作NEWS
CMU15445學(xué)習(xí)經(jīng)驗(yàn)(附簡單的b+樹優(yōu)化策略)
在學(xué)習(xí)CMU15445這門課程時,我總結(jié)了一些個人經(jīng)驗(yàn),希望能對后來者有所幫助。這門課程的學(xué)習(xí)建議如下:
建議在學(xué)習(xí)操作系統(tǒng)之后再來學(xué)習(xí)這門課程。CMU自己提供的預(yù)置課程應(yīng)該是15-213。如果你僅是完成實(shí)驗(yàn),可能不需要了解操作系統(tǒng)知識,但在課程前半期,課堂上會多次涉及操作系統(tǒng)相關(guān)討論。如果你追求深入理解,不懂操作系統(tǒng)可能在上課時感到困難。
課程實(shí)驗(yàn)部分使用C++語言。我建議在開始實(shí)驗(yàn)前,花大約5天時間學(xué)習(xí)北大郭煒老師的C++課程,特別是其中關(guān)于面向?qū)ο缶幊毯椭悄苤羔樀牟糠?。這門課程內(nèi)容深入,適合有一定C語言基礎(chǔ)的學(xué)員。此外,推薦使用learncpp網(wǎng)站的教程和文檔cppreference進(jìn)行輔助學(xué)習(xí)。
對于英文水平較弱的學(xué)員,建議在B站查找漢化版課程視頻。主講老師根據(jù)CMU的課件自己講解,講得較好。雖然官方部分課程由學(xué)生講解,質(zhì)量參差不齊,但觀看課程視頻仍然是必不可少的。
課程總結(jié)方面,建議參考andy在課程網(wǎng)站提供的notes,內(nèi)容詳實(shí),基本覆蓋了課堂講解。國內(nèi)也有相關(guān)總結(jié),自行查找即可。這些總結(jié)通常停留在課程notes和ppt層面,未涉及個人思考或疑問,僅作為英文水平不夠時的輔助材料。
實(shí)驗(yàn)部分,強(qiáng)烈推薦學(xué)習(xí)智能指針的相關(guān)知識。我建議在完成實(shí)驗(yàn)前,先閱讀learncpp上智能指針章節(jié),內(nèi)容詳盡,從基礎(chǔ)到進(jìn)階,解釋了智能指針的必要性及使用方法。此外,參考cnblogs上的一篇帖子,該文提供了寶貴見解。
在實(shí)驗(yàn)P0(2020年智能指針)中,我推薦學(xué)習(xí)Learncpp網(wǎng)站的智能指針章節(jié)。它從基礎(chǔ)開始,逐步深入,解釋了為何我們需要智能指針及基本用法。建議在完成實(shí)驗(yàn)時,花費(fèi)時間學(xué)習(xí)智能指針部分。
實(shí)驗(yàn)P1(bufferPool)內(nèi)容相對簡單,多數(shù)學(xué)生采用哈希表+雙向鏈表策略。實(shí)現(xiàn)時可參考innodb中bufferPool的策略,特別是區(qū)分新代和老代的部分。盡管無法實(shí)現(xiàn)簡單的預(yù)讀策略,但理解bufferPool的實(shí)現(xiàn)有助于深入理解課程內(nèi)容。
實(shí)驗(yàn)P2(b+tree)是課程的難點(diǎn)之一。遇到的主要問題是b+樹頁面讀寫鎖與bufferpool頁面鎖之間的原子性問題。解決這一問題時,我引入了一個is_delete_標(biāo)志位,用于檢測頁面刪除操作,確保原子性。
實(shí)驗(yàn)P2的檢測與調(diào)試部分,我提出了幾種檢測方法,包括檢測page溢出、b_node內(nèi)部檢測、assert使用、bufferPool檢查以及多線程調(diào)試技巧。這些方法有助于確保代碼正確性和性能優(yōu)化。
實(shí)驗(yàn)P3(execution)部分關(guān)注于查詢執(zhí)行計(jì)劃的生成,提供了一種理解tuple、page、table物理組織方式及Schema相關(guān)類交互關(guān)系的途徑。這部分內(nèi)容看似復(fù)雜,實(shí)際理解后有助于掌握SQL查詢優(yōu)化的原理。
實(shí)驗(yàn)P4(lock_manager)相對簡單,主要涉及鎖管理機(jī)制,遵循課程指導(dǎo)完成即可。
課程中最重要的部分之一是實(shí)驗(yàn)P2的b+tree優(yōu)化。我通過引入樂觀策略和改進(jìn)bufferPool實(shí)現(xiàn),將實(shí)驗(yàn)耗時從4.3s降低到2.1s。樂觀策略通過更直接的鎖申請和釋放,提高了并發(fā)性能。同時,改進(jìn)bufferPool實(shí)現(xiàn),將index頁的pin_count設(shè)置為2,避免頻繁置換,顯著提高了性能。
多重隨機(jī)標(biāo)簽