sqlite文件分析

sqlite文件分析

ID:20448117

大?。?14.16 KB

頁數(shù):15頁

時間:2018-10-13

sqlite文件分析_第1頁
sqlite文件分析_第2頁
sqlite文件分析_第3頁
sqlite文件分析_第4頁
sqlite文件分析_第5頁
資源描述:

《sqlite文件分析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。

1、SQLite文件分析作者:饒捃1前言在移動終端APP開發(fā)屮,數(shù)據(jù)存儲的性能是影響APP整體性能的重要因素之一,當(dāng)今主流手機操作系統(tǒng):IOS、Android、WindowsPhone等平臺最常使用的數(shù)據(jù)庫是SQLite,研究SQLite對于深度優(yōu)化移動APP數(shù)據(jù)存儲性能會比較有幫助。本文重點介紹SQLite主數(shù)據(jù)文件的操作原理,文中沒有過多介紹具體字節(jié)級的含義,而較多使用了閣例來方便大家理解。本文沒有討論SQLite日志文件等臨時文件,日志文件主要用于保障主數(shù)據(jù)文件的完整性。1.1預(yù)備知識(1)Btree,B-tree,B+t

2、ree文屮涉及到的最重要的數(shù)據(jù)結(jié)構(gòu)是B樹,SQLite文件大體就是許多棵B樹的集合。每一張數(shù)據(jù)表、表的每一個索引都是以B樹的形式存儲在文件中的。讀本文前需要了解B樹相關(guān)知識。在SQLite中,存儲表數(shù)據(jù)用B+tree,存儲表索引用B-tree。表索引和表數(shù)據(jù)采用不同的B樹的原因是為了提高10效率。注:后面文中在不區(qū)分B-tree和B+tree的地方統(tǒng)一用Btree來統(tǒng)稱這兩種B樹。(2)Page(頁)SQLite數(shù)據(jù)庫文件由固定大小的“頁(page)”組成。頁的大小可以在512?32768之間(包含這兩個值,必須是2的指數(shù))

3、,默認大小為1024個字節(jié)。頁大小可以在數(shù)據(jù)庫剛創(chuàng)建時設(shè)置,創(chuàng)建數(shù)據(jù)庫之后,Page大小不再改變。Page是SQLite中B樹的結(jié)構(gòu)單元,也是磁盤讀寫的單元。數(shù)據(jù)文件中的Page從1開始編號,順序排列在文件中,通過Page號可以很方便定位出Page在文件中的具體位置。(3)rovid每張表里的每條記錄都會有一個唯一的整數(shù)id:rowid,這個是用于查找記錄的關(guān)鍵key值。如果建表時創(chuàng)建了integer型主鍵,該值就作為rowid使用。如果沒有創(chuàng)建,則系統(tǒng)向動生成integer的rowid,rowid用變長整數(shù)來表示。(4)

4、變長整數(shù)變長整數(shù)是SQLite的特色之一,它既可以處理大整數(shù),又可以節(jié)省存儲空間。可變長整數(shù)巾1?9個字節(jié)組成,每個字節(jié)的低7位有效,第8位是標(biāo)志位。在組成可變長整數(shù)的各字節(jié)中,前面字節(jié)(整數(shù)的高位字節(jié))的第8位置1,只有最低一個字節(jié)的第8位置0,表示整數(shù)結(jié)束??勺冮L整數(shù)可以不到9個字節(jié),即使使用了全部9個字節(jié),也可以將它轉(zhuǎn)換為一個64-bit整數(shù)。下而是一些可變長整數(shù)的例子,例子取向源文件btree.c屮的注釋:0x00轉(zhuǎn)挽為0x000000000x7f轉(zhuǎn)換為0x0000007f0x810x00轉(zhuǎn)換為0x000000800

5、x820x00轉(zhuǎn)挽為0x000001000x800x7f轉(zhuǎn)換為0x0000007f0x8a0x91OxdlOxac0x78轉(zhuǎn)挽為0x123456780x810x810x810x810x01轉(zhuǎn)換為0x1020408,該值與本人驗算不一致,應(yīng)是筆誤。上面例子取A源文件bree.c中的注釋,但0x12345678這個似乎是錯誤的,歡迎大家驗算糾正。相應(yīng)的計算函數(shù)是sqlite3GetVarint和sqlite3PutVarint。2文件格式2.1系統(tǒng)表sqlite_masterSQLite數(shù)掘庫文件巾多棵Btree構(gòu)成,每?棵Bt

6、ree至少占用一個完整的頁,侮個頁是Btree的一個結(jié)點單元。每個表或索引的第I個頁為根頁(rootpage),所有表或索引的根頁編號都存儲在系統(tǒng)表sqlite_master屮,表sqlite_master的根頁力page1。sqlite_master是SQLite系統(tǒng)表,保存了數(shù)據(jù)庫的結(jié)構(gòu)(schema)信息,它包含5個字段:編號字段說明1type值為"table'1、"index">"trigger"或"view"之一。2name對象名稱,值為字符串。3tbl_name如果是表或視圖對象,此字段值與字段2相同。如果是索引

7、或觸發(fā)器對象,此字段值為與其相關(guān)的表名。4rootpage對觸發(fā)器或視閣對象,此字段值為0。對表或索引對象,此字段值為其根頁的編號。5SQL字符串,創(chuàng)建此對象時所使用的SQL語句。2.2Page的格式每個頁由四個部分構(gòu)成:1.頁頭2.單元指針數(shù)組3.未分配空間1.單元內(nèi)容區(qū)首先介紹“單元”的概念:Btree頁A部以單元(cell)為單位來組織數(shù)裾,一個單元包含一個(或部分,當(dāng)使用溢出頁時)payload(也稱為Btree記錄)。由于各類數(shù)據(jù)人小各不相同,每個單元的人小也就是可變的,所以Btree頁內(nèi)部的空間需要進行動態(tài)分配。

8、頁㈧所有單元的內(nèi)容集屮在頁的底部,稱為“單元內(nèi)容區(qū)”,由下向上增長。由于單元的大小可變,因此耑要對每個單元在頁內(nèi)的起始位置(稱為單元指針)進行記錄。單元指針保存在單元指針數(shù)組中,位于頁頭之后。單元指針數(shù)組包含0個或多個指針,由上向下增長。單元指針數(shù)組和單元內(nèi)容區(qū)相向增長,中間部分為未分配空

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。