1. 程式人生 > >SQLite學習筆記(八)&&sqlite實現架構

SQLite學習筆記(八)&&sqlite實現架構

讀寫 virt 管理 tor 嵌入式 代碼生成器 分析 並發 sqli

該系列的前面一些文章我重點講了sqlite的核心功能,比如封鎖機制,共享緩存,以及事務管理等。但對於sqlite的整體沒有作一個全面的介紹,本文將從實現的層面,整體介紹sqlite的框架、各個核心模塊以及功能。後續再針對核心模塊作進一步的分析。我們說sqlite是一個關系型的嵌入式數據庫。提到關系型數據庫,我們會想到諸如oracle,mysql,sqlserver等主流數據庫,它們的核心功能點在於支持SQL,支持事務;提到嵌入式數據庫,我們會想到berkeleyDB,sqlite,它們核心在於嵌入式,即作為應用程序的一部分,沒有獨立的進程。Sqlite當然具有以上特性,那麽這些特性在sqlite中如何實現,有哪些模塊實現呢?

技術分享圖片

圖1

如圖1,Sqlite由7個模塊組成,分別是詞法分析器(Tokenizer),解析器(Parser),代碼生成器(Code generator),虛擬機(Virtual machine),Tree模塊,Pager模塊以及OS接口。前面3個模塊主要用於解析SQL語句或者命令,後面四個模塊則主要用於執行。雖然各個數據庫的模塊劃分可能千差萬別,但基本功能是一致的。為了解析SQL,一定有詞法+語法分析+語義分析;為了能執行SQL語句,一定需要先生成執行計劃,並通過優化器選擇最優的執行計劃;為了實現事務的ACID特性,一定有事務管理模塊,並發控制模塊和故障恢復模塊等。其實說白了就是這麽些東西,針對sqlite,我們看看這些核心的功能分別是由具體哪個模塊實現的。

Tokenizer:將SQL語句進行分詞

Parser:將詞法分析器的輸出作為它的輸入,結合語義(利用元數據判斷,比如表是否存在),生成一個語法樹,並最終轉換化為執行計劃樹,這個過程中包含了通過優化器選擇最佳路徑。所以說整個詞法分析+語法分析+語義分析+代價優化都在Parser這個模塊中實現。

Code generator:將執行計劃樹生成虛擬機指令集,這個是sqlite比較獨特的地方,主要為虛擬機做準備。

Virtual machine:通過執行代碼生成器產生的指令集,來執行SQL語句滿足用戶的需求。通過操作數據庫文件中的記錄,來查詢或修改數據。

The tree:將用戶的記錄通過B樹結構來管理,每個用戶表通過一個B+樹管理,每個索引通過一個B樹管理。VM通過tree模塊實現從Btree中查詢、插入、刪除、更新記錄,或者創建/刪除一個Btree等。所有這些操作接口都有tree模塊封裝。VM執行指令時,直接調用接口即可。

The pager:在tree模塊看來,所有的B樹的節點都是在內存中的,tree模塊不直接與數據庫文件打交道。Pager模塊負責直接與數據庫文件交互,它管理緩存,並負責內外存交互。同時它還負責並發控制和故障恢復。所以pager模塊是sqlite中核心模塊之一,事務的ACID特性全部靠pager模塊實現。

The operating system interface:針對不同的操作系統,提供統一的操作文件接口。Pager模塊並不關心底層的硬件和操作系統,在它看來,只需要調用統一的接口就能達到讀寫文件的目的。當然不僅限於此,除了文件IO,mutex,sleep,隨機數生成的統一接口也是該模塊封裝的。

可以看到,sqlite每個模塊的功能邊界非常清晰,模塊間雖相互依賴,但耦合度很低,因此sqlite擴展相對容易。麻雀雖小,五臟俱全用在sqlite身上再合適不過了,哈哈!

http://www.cnblogs.com/cchust/p/4964150.html

SQLite學習筆記(八)&&sqlite實現架構