SQLite資料庫檔案格式分析(B樹的基主要組織)

來源:互聯網
上載者:User
此分析稱為簡易版,因為後面還計劃分析一個更複雜的資料庫檔案,以深入理解SQLite資料庫B樹實現的結構,從簡易的開始不失為一種好的學習方法,這裡的簡易版本檔案是指大小為2K位元組,即每個B樹頁1K位元組,共兩個B樹頁,補充說明一下,這裡的B樹頁就是指經典資料結構書上所講的B樹節點,在這裡稱為頁是因為SQLite在實現B樹時就是使用頁page的概念來組織的。

建立方法如下:
CREATE TABLE tbl1(one varchar(10),two varchar(10));
INSERT INTO "tbl1" VALUES('first', 'xxx');
INSERT INTO "tbl1" VALUES('second', 'yyy');然後退出,用UltraEdit開啟這個資料庫檔案:
00000000h: 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 ; SQLite format 3.
00000010h: 04 00 01 01 00 40 20 20 00 00 00 07 00 00 00 00 ; .....@  ........
00000020h: 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 01 ; ................
00000030h: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ; ................
00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000060h: 00 00 00 00 0D 00 00 00 01 03 B8 00 03 B8 00 00 ; ..........?.?.
00000070h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
這中間部分全部都是零。省去!
000003a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000003b0h: 00 00 00 00 00 00 00 00 46 01 06 17 15 15 01 71 ; ........F......q
000003c0h: 74 61 62 6C 65 74 62 6C 31 74 62 6C 31 02 43 52 ; tabletbl1tbl1.CR
000003d0h: 45 41 54 45 20 54 41 42 4C 45 20 74 62 6C 31 28 ; EATE TABLE tbl1(
000003e0h: 6F 6E 65 20 76 61 72 63 68 61 72 28 31 30 29 2C ; one varchar(10),
000003f0h: 74 77 6F 20 76 61 72 63 68 61 72 28 31 30 29 29 ; two varchar(10))     這是第一個B樹頁,這個B樹頁裡存放了表sqlite_master的資訊,這就是SQLite資料庫的系統資料表了。
下面分析一下這些二進位的具體涵義,SQLite統一採用大端法來表示資料,不同與一般intel機器的小端法了:
位移地址   大小    涵義
 0          16     "SQLite format 3\000"
16           2     400H=1024個位元組,每個頁面的位元組數  
18           2     0101H表示版本號碼而已
20           1     每頁末端的未用空間,這裡為零表示資料都是從每頁最後一個位元組開始存放
21           1     最大負載分區數,類似與IP分區,一頁存不下,要分區
22           1     最小負載分區數
23           1     最小葉子負載分區數
24           4     檔案修改計數,用於實現並行訪問
28           4     保留未用
32           4     第一個freelist頁
36           4     檔案中的freelist頁數
40          60     這裡未用
上面的這一百個位元組稱為資料庫檔案的檔案頭,這個檔案頭只有第一個B樹頁才有,後面的每一個B樹頁都沒有這個結構,後面每一頁結構都相同:
依次為:B樹頁頭結構,B樹指標結構,未用空間,B樹實際資料負載。
這裡和經典資料結構書上的B樹結構有些出入,這裡的目的是實際應用方便,而書上的結構目的是解釋清楚B樹的原理。所以有些不同:
一般書上講的一個B樹頁的結構為:指標,資料,指標,資料,指標,資料,...,指標
而SQLite組織為:指標,指標,指標,...,指標,資料,資料,...資料。
第一個頁面中從00000060h行第五個位元組開始就表示B樹頁頭結構了:
位移地址   大小    涵義
0           1      0Dh=1101b各位意義為1: intkey, 2: zerodata, 4: leafdata, 8: leaf
1           2      第一個空閑塊的位元組位移量,這裡為0
3           2      01,這個B樹頁存放的記錄數為1個,即系統資料表中只存放了一條記錄,因為只建立了一個表tbl1
5           2      負載區首地址,03B8,往下看到000003b0h行那個46就是負載區的開始了
7           1      分區數,這裡資料少,不考慮,所以為0
到0000006Bh位移處B數頭結束了,接下來的就是B數指標結構了,此處只有一項,只有一個指標03B8h處。
從000003B8h位移到結束都是sqlite_master表的實際資料了。當然這些資料也是有結構的。46h表示這條記錄有70個位元組,除去其本身46,和後面的01是索引外,整個記錄剛好是70個位元組,01索引後面都是payload負載資料了。
如法炮製,下面列出第二個B樹頁:
00000400h: 0D 00 00 00 02 03 E5 00 03 F3 03 E5 00 00 00 00 ; ......?.??...
00000410h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
這中間部分全部為零。省去!
000007d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000007e0h: 00 00 00 00 00 0C 02 03 19 13 73 65 63 6F 6E 64 ; ..........second
000007f0h: 79 79 79 0B 01 03 17 13 66 69 72 73 74 78 78 78 ; yyy.....firstxxx
由於不是第一頁,所以不存在檔案頭的100個位元組了,一開始就是B樹頁頭結構了,這裡有兩個指標03F3和03E5,其它的和上面一樣。整個資料庫管理系統就是準確無誤地對這個檔案進行管理。
進一步的工作:只有資料多了,才能看出B樹組織的好處:尋找,刪除,增加的快速!把這個檔案變大再分析!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.