除了內存數據庫,SQLite存儲一整個數據庫在一個單獨的數據庫文件。
在他的生命週期以內,這個數據文件能夠增加或者收縮。
一個數據庫文件能夠增加到操做系統限制的文件大小。
操做系統的原生文件系統對待這個數據庫文件就像一個普通的文件同樣。
文件系統並不理解文件的內容,他看這個文件就僅僅是一系列的字節串。
他僅僅提供原生的讀或者寫文件中的任何大小的字節數據,這個字節數據能夠從任何偏移量的位置開始讀寫。
他仍然提供文件上的刷新同步操做。
下面的章節咱們將會討論一個數據庫文件是如何組裝成邏輯的頁面的,而且這些頁面是如何組織的。sql
3.2.1 page的抽象
爲了方便空間管理以及從數據庫文件中讀寫數據。
SQLite劃分每一個數據庫文件(包含內存型數據庫)成爲固定大小的區域,被稱爲數據庫頁或者簡稱爲頁。
所以,一個數據庫文件的大小一直是page大小的整倍數。
page的編號線性增加且從1開始,第一個page被稱爲page1 第二個page被稱爲page2 以此類推。
page編號0被當作NULL PAGE 或者"不是一個page",由於這個page物理上是不存在的。
page1和後面的page都線性的存儲在一塊兒,一個接着一個,文件從偏移量0開始計數。
你能夠把這個數據庫看作一個可變大小的數組,該數組中的元素是固定大小的數據庫頁。
而且這個數據庫頁的編號被用做數組的下標來獲取這些page
事實上,pager模塊創造了這個抽象的概念在原生的文件系統之上。
數據庫
3.2.2 Page大小
默認的page大小是1024字節,可是這個是編譯時可定製的參數。
你能夠修改這個值當你使用源碼編譯SQLite的庫時。
page大小必須是2的倍數,且範圍在512 到 65536範圍內,兩邊邊界都包括。
後面的邊界範圍是由於存儲page size的變量是一個2字節的無符號整形變量。
一個數據庫文件能夠擁有2147483647個page(2的31次方 -1),這個數值是硬編碼在PAGER_MAX_PGNO 宏位於pager.c源文件數組
所以,一個數據庫能夠最大有140Tb字節大小 2的16次方 * 2的31次方大小 字節 固然,受制於sqlite所暴露的原生的文件系統。編碼
修改Page大小: 一旦一個數據庫文件被建立,SQLite使用編譯時設置的默認page大小,可是你能夠修改這個page大小經過page_size pragma 命令 在建立數據庫中的第一個table以前.操作系統
SQLite存儲這個page_size設置的大小做爲文件的一個元數據。
在工做時他將會使用這個page size的大小而不是默認的大小。
數據庫會完美的工做甚至之後你使用了一個不一樣的SQLite 庫,該庫在編譯時定製化了不一樣的默認page大小.net
3.2.3 Page types
SQLite對全部的爲數據庫文件分配的page保持着監測,不管這些page如今是否正在被使用。他保持着引用信息用於追蹤。他負責對全部的page的管理以確保沒有孤懸在外的不受控制的page存在,由於SQLite當中不存在垃圾回收的設計。
針對他們的用處不一樣,pages 被區分爲四種類型,free tree pointer-map lock-byte
Tree pages 又能夠分爲葉子頁 內部頁以及溢出頁
free pages 是不活躍的pages 或者是當前未被使用的pages;其他的是活躍的pages而且他們歸屬於B-或者B+樹
還有就是pointer-map 和 lock-byte pages
B+樹的內部頁包含有查找樹中葉節點的方向性信息。
B-Tree 的內部頁包含有查詢性信息以及數據
葉子頁在B+樹當中存儲着真實的數據。
若是一行數據太大以致於一個大單獨的page存儲不下,只有部分數據將會存儲在樹的page中,其他的數據將會存在到一個或者多個溢出頁中設計
https://blog.csdn.net/qq_37940313/article/details/80474266sqlite