數據庫命名約定
sqlite3_open()API用到數據庫的文件名,可以是相對當前工作目錄的相對路徑名,也可以是從系統根文件樹開始的完整路徑名。任何被本地文件系統接受的正規文件名都是好的。
如果文件名是C語言中的NULL指針(即,0),SQlite創建並打開一個臨時文件。如果文件名是內存地址,SQLite創建一個內存數據庫。在這兩種情況中,當應用程序關閉數據庫時,數據庫都會被消滅,即數據庫不是持久的。SQLite隨機選擇臨時文件名(以sqlite_開頭,后跟16位字母數字隨機串)。文件嘗試在以下目錄存儲,(1) /var/tmp, (2) /usr/tmp, (3) /tmp, (4) 當前工作目錄。不管是什么方式打開的數據庫(文件數據庫,臨時數據庫,內存數據庫),在SQLite內部都被命名為主數據庫(main database)。
在內部,數據庫文件名不是數據庫名。他們是相關但是不同的概念。用attach命令,可以把一個數據庫文件以不同的數據庫別名關聯到一個數據庫連接上。可以通過這些別名訪問數據庫文件。
當應用程序用sqlite3_open()打開數據庫時,SQLite會為每一個連接維護一個單獨的臨時數據庫。臨時數據庫存儲臨時對象(表及其索引)。應用程序可以在其查詢中用這兩個名稱(main和temp),例select * from temp.table1返回在臨時數據庫中表1的所有行,而不是主數據庫中的。臨時數據庫的catalog名是sqlite_temp_master。臨時對象只在相同的數據庫連接內才是可見的,在對相同數據庫的不同的連接是不可見的,即使是同一個線程,進程或是程序。SQlite把臨時數據庫存儲在一個與主數據庫文件不同的單獨的臨時文件中。當應用程序關閉到主數據庫的連接時,會刪除這個臨時文件。
數據庫文件系統
除了內存數據庫,SQLite存儲一整個數據庫(main或temp)在一個單獨的頁中。
頁:為了方便空間按管理,SQLite把數據庫(包括內存數據庫)划分成固定大小的區域,稱為數據庫的頁(頁大小為2的冪次方,從512到32768,默認1024。上界是由在代碼中或在外部存儲中的2字節的有符號整數確定的)。數據庫是由頁的數組(可擴大或縮小)組成的,數組的下標稱為是頁號,下標從1開始直到231 -1結束(上界由本地文件系統的最大文件長度確定)。第0頁被作為沒有此頁或不是個頁對待,總之是物理上不存在的頁。第1頁以及以后的頁都是依次從數據庫文件偏移量為0的位置開始排列。
一旦創建了數據庫文件,SQLite采用默認的也大小,但是在創建第一個表之前,也可通過編譯命令改變頁大小。SQlite把頁大小作為元數據的一部分來存儲。將會用這個值代替默認的頁大小(編譯命令用來改變數據庫的行為特性)。
頁類型:有四種頁:葉子頁,內部頁,溢出葉,自由頁。自由頁是無效(當前未被使用),其他的都是活躍的頁。
B+樹內部頁有搜索導航信息,葉子頁存儲實際的數據(表中的行),如果一行信息量太大不能放入一個頁中,則部分數據存入葉子頁中,剩余的存在溢出頁中。
B樹有內部頁有搜索信息和數據。
文件頭:SQLite可以把任何頁類型用於任何數據庫頁,除了第1頁,它總是B+樹的內部頁。在該頁0偏移地址處存儲了100字節的文件頭記錄,文件頭記錄描述了數據庫文件的數據結構。SQLite在建立一個數據庫文件時初始化文件頭。
Ofset | Size | Description | |
0 | 16 | Header string | 16字節字符串 "SQLite format 3." |
16 | 2 | Page size in bytes | 本數據庫各個頁的大小. |
18 | 1 | File format write version | 這兩個字節表示該文件格式的版本。在當前版本中,兩字節都為1,否則會返回錯誤。如果未來文件格式變化,數字會增長以表示新的文件格式版本號 |
19 | 1 | File format read version | 同上 |
20 | 1 | Bytes reserved at the end of each page | 在每一頁結束的地方SQLite為其自己目的存儲(<=255字節)內容,默認值是0,如果是非0值,則SQLite用內嵌的加密方式加密,頁面的前半部分(從頁面尺寸-保留尺寸)是可用的,數據內容在前半部分存儲。 |
21 | 1 | Max embedded payload fraction | 在B/B+樹內部節點中的單條記錄的最大可用空間,最大值是255,默認值是64(一頁能裝4條記錄)。如果記錄太大,則盡可能的把多余信息放到溢出頁中,從而使得內部節點的記錄大小在最小可用空間(下一項內容,默認32)之上。 |
22 | 1 | Min embedded payload fraction | |
23 | 1 | Min leaf payload fraction | 葉子節點最小的可用空間,默認32,能存8個。默認最大255但是並未在頭信息中聲明出來。B樹中沒有特殊用途的葉子節點。 |
24 | 4 | File change counter | 被事務調用,每一個事務都會使得值增加。這個值是當數據庫變化時,頁管理器不刷新其緩存。 |
28 | 4 | Reserved for future use | |
32 | 4 | First freelist page | 未被使用的頁面的的列表。分兩種頁面,主干頁和葉子頁。當頁面處在非活動狀態時,頁面被放入列表,系統並不會釋放頁面,當要用時,SQLite取出頁在去存儲信息。如果列表為空,則從本地文件系統再獲得新頁,並加到數據庫文件。 |
36 | 4 | Number of freelist pages | 未被使用的頁的數目。 |
40 | 60 | 15 4-byte meta values | 元數據,存儲了很多的元變量。文件格式信息,架構信息等,編碼信息。 |
這些內容都是大端存儲的,可移植性較高。