天天看點

SQLite入門與分析(一)---簡介

寫在前面:出于項目的需要,最近打算對SQLite的核心進行一個完整的剖析,在此希望和對SQLite有興趣的一起交流。我知道,這是一個漫長的過程,就像曾經去讀Linux核心一樣,這個過程也将是辛苦的,但我相信結果一定是美好的... ...接下來是第一章。

1、SQLite介紹

自幾十年前出現的商業應用程式以來,資料庫就成為軟體應用程式的主要組成部分。正與資料庫管理系統非常關鍵一樣,它們也變得非常龐大,并占用了相當多的系統資源,增加了管理的複雜性。随着軟體應用程式逐漸子產品子產品化,一種新型資料庫會比大型複雜的傳統資料庫管理系統更适應。嵌入式資料庫直接在應用程式程序中運作,提供了零配置(zero-configuration)運作模式,并且資源占用非常少。

SQLite是一個開源的嵌入式關系資料庫,它在2000年由D. Richard Hipp釋出,它的減少應用程式管理資料的開銷,SQLite可移植性好,很容易使用,很小,高效而且可靠。

SQLite嵌入到使用它的應用程式中,它們共用相同的程序空間,而不是單獨的一個程序。從外部看,它并不像一個RDBMS,但在程序内部,它卻是完整的,自包含的資料庫引擎。

嵌入式資料庫的一大好處就是在你的程式内部不需要網絡配置,也不需要管理。因為用戶端和伺服器在同一程序空間運作。SQLite 的資料庫權限隻依賴于檔案系統,沒有使用者帳戶的概念。SQLite 有資料庫級鎖定,沒有網絡伺服器。它需要的記憶體,其它開銷很小,适合用于嵌入式裝置。你需要做的僅僅是把它正确的編譯到你的程式。

2、架構(architecture) 

SQLite采用了子產品的設計,它由三個子系統,包括8個獨立的子產品構成。

SQLite入門與分析(一)---簡介

2.1、接口(Interface)

接口由SQLite C API組成,也就是說不管是程式、腳本語言還是庫檔案,最終都是通過它與SQLite互動的(我們通常用得較多的ODBC/JDBC最後也會轉化為相應C API的調用)。

2.2、編譯器(Compiler)

在編譯器中,分詞器(Tokenizer)和分析器(Parser)對SQL進行文法檢查,然後把它轉化為底層能更友善處理的分層的資料結構---文法樹,然後把文法樹傳給代碼生成器(code generator)進行處理。而代碼生成器根據它生成一種針對SQLite的彙編代碼,最後由虛拟機(Virtual Machine)執行。

2.3、虛拟機(Virtual Machine)

架構中最核心的部分是虛拟機,或者叫做虛拟資料庫引擎(Virtual Database Engine,VDBE)。它和Java虛拟機相似,解釋執行位元組代碼。VDBE的位元組代碼由128個操作碼(opcodes)構成,它們主要集中在資料庫操作。它的每一條指令都用來完成特定的資料庫操作(比如打開一個表的遊标)或者為這些操作棧空間的準備(比如壓入參數)。總之,所有的這些指令都是為了滿足SQL指令的要求(關于VM,後面會做詳細介紹)。

2.4、後端(Back-End)

後端由B-樹(B-tree),頁緩存(page cache,pager)和作業系統接口(即系統調用)構成。B-tree和page cache共同對資料進行管理。B-tree的主要功能就是索引,它維護着各個頁面之間的複雜的關系,便于快速找到所需資料。而pager的主要作用就是通過OS接口在B-tree和Disk之間傳遞頁面。

3、SQLite的特點(SQLite’s Features and Philosophy)

3.1、零配置(Zero Configuration)

3.2、可移植(Portability):

它是運作在Windows,Linux,BSD,Mac OS X和一些商用Unix系統,比如Sun的Solaris,IBM的AIX,同樣,它也可以工作在許多嵌入式作業系統下,比如QNX,VxWorks,Palm OS, Symbin和Windows CE。

3.3、Compactness:

SQLite是被設計成輕量級,自包含的。one header file, one library, and you’re relational, no external database server required

3.4、簡單(Simplicity)

3.5、靈活(Flexibility)

3.6、可靠(Reliability):

SQLite的核心大約有3萬行标準C代碼,這些代碼都是子產品化的,很容易閱讀。

主要參考:The Definitive Guide to SQLite