溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解SQLite軟件架構(gòu)

發(fā)布時(shí)間:2021-10-22 15:41:33 來(lái)源:億速云 閱讀:172 作者:iii 欄目:數(shù)據(jù)庫(kù)

本篇內(nèi)容主要講解“如何理解SQLite軟件架構(gòu)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何理解SQLite軟件架構(gòu)”吧!

SQLite是一個(gè)非常受歡迎的數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)排行榜中已經(jīng)進(jìn)入前十的行列。這主要是因?yàn)樵摂?shù)據(jù)庫(kù)非常小巧,而且可以支持Linux、Windows、iOS和Andriod的主流的操作系統(tǒng)。

如何理解SQLite軟件架構(gòu)

SQLite非常簡(jiǎn)單,是一個(gè)進(jìn)程內(nèi)的動(dòng)態(tài)庫(kù)數(shù)據(jù)庫(kù)。其最大的特點(diǎn)是可以支持不同的語(yǔ)言來(lái)使用,比如C、C++、Java等等。同時(shí),SQLite還是一個(gè)開(kāi)源的數(shù)據(jù)庫(kù),也就是開(kāi)發(fā)者可以根據(jù)自己的需求來(lái)修改數(shù)據(jù)的功能特性。

SQLite雖然非常小巧,但功能卻非常豐富,正所謂“麻雀雖小,五臟俱全”。SQLite不僅具備基本的SQL特性,還具備索引、觸發(fā)器、視圖和事務(wù)等特性。

SQLite的主要API

SQLite提供兩種訪問(wèn)接口,一種是通過(guò)sqlite命令行工具,另外一種是通過(guò)動(dòng)態(tài)庫(kù),也就是API函數(shù)。在學(xué)習(xí)SQLite架構(gòu)之前,我們有必要對(duì)其API進(jìn)行一個(gè)簡(jiǎn)要的介紹。其實(shí)SQLite的API很簡(jiǎn)單,主要包括三個(gè),分別是sqlite3_open、sqlite3_exec和sqlite3_close三個(gè)函數(shù)。其中sqlite3_exec則是用于執(zhí)行SQL語(yǔ)句的函數(shù)。

也就是說(shuō)sqlite3_exec是SQLite功能的關(guān)鍵入口,我們后面分析代碼也應(yīng)該以此函數(shù)作為突破點(diǎn)。其它函數(shù)相對(duì)簡(jiǎn)單,也沒(méi)那么重要。

SQLite整體架構(gòu)

首先我們從整體架構(gòu)上介紹一下SQLIte。其架構(gòu)如圖所示,包括接口層、SQL命令處理器和存儲(chǔ)后端等。

如何理解SQLite軟件架構(gòu)

最為核心的不是就是SQLite內(nèi)核了。其中包括接口層、SQL命令處理器和虛擬機(jī)三部分。SQL命令處理器負(fù)責(zé)對(duì)用戶的SQL進(jìn)行預(yù)處理,最終生成適用于虛擬機(jī)執(zhí)行的代碼。

其下是后端部分,后端部分相當(dāng)于存儲(chǔ)引擎。下面我們簡(jiǎn)要的介紹一下每個(gè)模塊的功能。

(1) 接口

SQLIte庫(kù)的使用通過(guò)函數(shù)調(diào)用實(shí)現(xiàn)。為了避免與其它庫(kù)出現(xiàn)沖突,SQLite的函數(shù)都以sqlite3作為前綴。接口部分的實(shí)現(xiàn)在文件main.c,legacy.c和vdbeapi.c中。其中main.c中包含其主要的接口,包括sqlite3_open、sqlite3_config和sqlite3_close等等。SQLite中最終的函數(shù)不在main.c中,而是在legacy.c中,該文件中只包含這一個(gè)接口的實(shí)現(xiàn)。

(2) 詞法分析器

詞法分析器對(duì)SQL語(yǔ)句字符串進(jìn)行解析,最終生成單詞(token)序列。并且將生成的單詞序列傳給解析器進(jìn)行下一步的動(dòng)作。該功能的具體實(shí)現(xiàn)在文件tokenize.c中,核心入口函數(shù)為sqlite3RunParser。

(3) 解析器

SQLite的解析器基于Lemon實(shí)現(xiàn),它實(shí)現(xiàn)將SQL語(yǔ)句字符串解析成語(yǔ)法樹(shù)。Lemon是一個(gè)與YACC/BISON類(lèi)似的詞法分析庫(kù)。該庫(kù)的源代碼在tool目錄中。

(4) 代碼生成器

代碼生成器用于生成與SQL語(yǔ)句對(duì)應(yīng),可以在虛擬機(jī)執(zhí)行的代碼。代碼生成器實(shí)現(xiàn)比較復(fù)雜,包含的文件有:build.c, delete.c, attach.c,  expr.c, insert.c, pragma.c, select.c,  auth.c等等。通過(guò)文件名可以看出,這里很多文件其實(shí)分別對(duì)應(yīng)著一個(gè)SQL語(yǔ)句,比如delete,insert和select等。

(5) 虛擬機(jī)

SQL的具體執(zhí)行在一個(gè)稱為虛擬機(jī)的組件中進(jìn)行的,這個(gè)在前面架構(gòu)圖中已經(jīng)有所展示。虛擬機(jī)執(zhí)行的代碼有前面代碼生成器產(chǎn)生。虛擬機(jī)的實(shí)現(xiàn)在文件vdbe.h和vdbe.c中。

(6) B-樹(shù)

SQLite的數(shù)據(jù)通過(guò)B樹(shù)進(jìn)行組織管理。每個(gè)表或者索引都有一個(gè)對(duì)應(yīng)的B樹(shù)。所有的B樹(shù)存儲(chǔ)在一個(gè)數(shù)據(jù)庫(kù)文件中。B樹(shù)的具體實(shí)現(xiàn)在btree.c和btree.h文件中。

(7) 頁(yè)緩存

SQLite的文件被劃分為等份大小,B樹(shù)也是以該大小為粒度來(lái)對(duì)數(shù)據(jù)進(jìn)行管理。頁(yè)緩存是該粒度對(duì)應(yīng)的內(nèi)存內(nèi)容,通過(guò)該內(nèi)存實(shí)現(xiàn)對(duì)數(shù)據(jù)塊的讀寫(xiě)等訪問(wèn)。頁(yè)緩存相關(guān)的實(shí)現(xiàn)在pager.c和pcache.c等文件中。

(8) 操作系統(tǒng)接口

SQLite是一個(gè)跨平臺(tái)的數(shù)據(jù)庫(kù),其存儲(chǔ)數(shù)據(jù)需要兼容Windows和Linux的文件系統(tǒng)API。為了方便,SQLite實(shí)現(xiàn)了一個(gè)抽象層。這樣對(duì)于SQLite業(yè)務(wù)邏輯來(lái)說(shuō),只需要調(diào)用該抽象層的接口即可,而不用關(guān)心操作系統(tǒng)。

(9) 基礎(chǔ)庫(kù)

包含一個(gè)被各個(gè)模塊都可能使用到的基礎(chǔ)庫(kù),比如內(nèi)存分配,字符串處理等。

SQLite文件格式

前文我們簡(jiǎn)要的介紹了一下SQLite的軟件架構(gòu)以及每個(gè)組件的基本功能。接下來(lái)我們介紹一下數(shù)據(jù)庫(kù)文件的相關(guān)功能。

在SQLite中一個(gè)文件承載著一個(gè)數(shù)據(jù)庫(kù)實(shí)例,這個(gè)文件稱為主庫(kù)文件(main database  file)。除了主庫(kù)文件外,還可能有一些其它文件,比如用于事務(wù)的日志文件等。本文主要集中介紹主庫(kù)文件,其它文件后續(xù)介紹。

(1) 頁(yè)

數(shù)據(jù)庫(kù)文件由多個(gè)頁(yè)構(gòu)成,每個(gè)頁(yè)的大小在512到65536字節(jié)之間,且大小必須是2的冪。頁(yè)通過(guò)編號(hào)進(jìn)行標(biāo)記,起始值為1,最大編號(hào)為2的31次冪-2。頁(yè)的默認(rèn)大小是4KB,本文以默認(rèn)大小為例進(jìn)行介紹。

如何理解SQLite軟件架構(gòu)

在數(shù)據(jù)庫(kù)中的每個(gè)頁(yè)都有一個(gè)特定的用途,這些用途包括:

  • 鎖字節(jié)頁(yè)(Lock-byte page)

  • 剩余 頁(yè)

  • B樹(shù) 頁(yè)

  • 指針映射頁(yè)

  • 有效負(fù)載溢出頁(yè)

數(shù)據(jù)庫(kù)文件的第一個(gè)頁(yè)是比較特殊的,它包含整個(gè)數(shù)據(jù)庫(kù)文件的描述信息,這里稱為數(shù)據(jù)庫(kù)頭信息。

(2) 數(shù)據(jù)庫(kù)頭

數(shù)據(jù)庫(kù)頭包含100個(gè)字節(jié)的內(nèi)容,其中每一個(gè)成員的偏移,大小和功能如下圖所示。

如何理解SQLite軟件架構(gòu)

我們可以創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)實(shí)例,然后對(duì)照文件內(nèi)容與數(shù)據(jù)庫(kù)頭的格式進(jìn)行理解。比如數(shù)據(jù)庫(kù)頭的第一個(gè)成員為一個(gè)魔數(shù),用于標(biāo)識(shí)該文件為SQLite數(shù)據(jù)庫(kù)文件及版本。在下圖中可以找到該信息,可以看出兩者完全匹配(SQLite  format 3)。

如何理解SQLite軟件架構(gòu)

除了上述數(shù)據(jù)庫(kù)頭的格式外,每個(gè)不同的頁(yè)都有不同的布局。

到此,相信大家對(duì)“如何理解SQLite軟件架構(gòu)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI