一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sqlite - SQLite中的B-Tree實現細節(jié)分析

SQLite中的B-Tree實現細節(jié)分析

2020-07-17 17:23Linux公社 Sqlite

本文將詳細介紹SQLite中的B-Tree實現細節(jié),需要了解更多的朋友可以參考下

SQLite在存儲在外部的數據庫是以B-Tree來組織的。關于B-tree的細節(jié),參考
**
** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3:
** "Sorting And Searching", pages 473-480. Addison-Wesley
** Publishing Company, Reading, Massachusetts.
**
基本思想是文件包含的每一頁都包括N個數據庫入口和N+1個指向子頁的指針。文件分成很多頁存儲。為什么這么干,因為內存分頁管理機制鬧得。外存中每個頁就是B樹的一個節(jié)點。
----------------------------------------------------------------
| Ptr(0) | Key(0) | Ptr(1) | Key(1) | ... | Key(N-1) | Ptr(N) |
----------------------------------------------------------------
Ptr(0)指向的頁上的所有的key的值都小于Key(0)。所有Ptr(1)指向的頁和子頁的所有的key的值都大于Key(0),小于Key(1)。所有Ptr(N)指向的頁和子頁的key的值都大于Key(N-1),等等。

為了知道一個特定的key,需要從磁盤上以O(long(M))來讀取,其中M是樹的階數。內存中找不到了,就發(fā)生缺頁中斷。
主要是解決內存中找不到的問題。一方面換出來一些。一方面換進去一些。換進去的時候要找到他們再硬盤的哪個頁面上啊。
(B樹的優(yōu)點就是適合于用塊兒存儲的存儲設備上。)利用所以,可以知道他們們在哪個頁面上。

在SQLite的實現中,一個文件可以含有1個或的過獨立的BTree。每一個BTree由它的根頁的索引來標識。所有入口的key和數據組成了有效負荷(payload)。數據庫的一頁有一個固定的有效負荷總量。如果負荷大于了預先設定的值,那么剩余的字節(jié)就會被存儲在溢出頁上。一個入口的有效負荷再加上前向指針(the preceding pointer)構成了一格(cell)。每一頁都有一個小頭部,包含了Ptr(N)指針和其它一些信息,例如key和數據的大小。

格式細節(jié)
一個文件分成了多個頁。第一頁叫做頁1,第二頁叫做頁2,一次類推。頁的個數為0表示沒有頁。頁的大小可以從512 到 65536。每一頁或者是一個btree頁,或者是一個freelist頁,或者是一個溢出頁。
第一頁一定是一個btree頁。第一頁的前面100個字節(jié)包含了一個特殊的首部(文件頭),它是這個文件的描述。
文件頭的個數如下:
** OFFSET SIZE DESCRIPTION
** 0 16 Header string(首部字符串): "SQLite format 3\000"
** 16 2 Page size in bytes(頁的字節(jié)數).
** 18 1 File format write version(文件寫操作的版本)
** 19 1 File format read version (文件讀操作的版本)
** 20 1 Bytes of unused space at the end of each page(每一頁結尾未使用的字節(jié))
** 21 1 Max embedded payload fraction(最大的嵌入有效負荷分片)
** 22 1 Min embedded payload fraction(最小的嵌入有效負荷分片)
** 23 1 Min leaf payload fraction(最小的頁有效負荷分片)
** 24 4 File change counter (文件變化計數器)
** 28 4 Reserved for future use (保留字節(jié))
** 32 4 First freelist page (第一個freelist頁)
** 36 4 Number of freelist pages in the file (本文件中freelist頁的個數)
** 40 60 15 4-byte meta values passed to higher layers()
**
所有的整數都是大端的。

每次修改文件時,文件變化計數器都會增加。這個計數器可以讓其他進程知道何時文件被修改了,他們的cache是否需要清理。

最大嵌入有效負荷分片是一頁的所有可用空間,被標準B-tree(非葉數據)表的單獨的一個所能使用的總量。值255代表100%。默認情況下,一格(cell)的最大量被限制為,至少有4格才能填滿一頁。因此,默認的最大嵌入負荷分片是64。

如果一頁的有效負荷大于了最大有效負荷,那么剩下的數據就要被存儲到溢出頁。一旦分配了一個溢出頁,有可能會有許多數據也被轉移到這個溢出頁,但是不會讓格cell的大小小于最小嵌入有效負荷分片的。

最小頁有效負荷分片與最小嵌入有效負荷分片類似,但是它是應用于LEAFDATA tree中的葉節(jié)點。一個LEAFDATA的最大有效負荷分片為100%(或者是值255),它不用再首部指定。

BTree的每一頁被分為三部分:首部,格(cell)指針數組,和格cell的內容。頁1還會在頁首部有100字節(jié)的文件頭。
**
** |----------------|
** | file header | 100 bytes. Page 1 only.
** |----------------|
** | page header | 8 bytes for leaves. 12 bytes for interior nodes
** |----------------|
** | cell pointer | | 2 bytes per cell. Sorted order.
** | array | | Grows downward
** | | v
** |----------------|
** | unallocated |
** | space |
** |----------------| ^ Grows upwards
** | cell content | | Arbitrary order interspersed with freeblocks.
** | area | | and free space fragments.
** |----------------|
**
頁首部如下圖所示:
**
** OFFSET SIZE DESCRIPTION
** 0 1 Flags. 1: intkey, 2: zerodata, 4: leafdata, 8: leaf
** 1 2 byte offset to the first freeblock
** 3 2 number of cells on this page
** 5 2 first byte of the cell content area
** 7 1 number of fragmented free bytes
** 8 4 Right child (the Ptr(N) value). Omitted on leaves.
**
標志位定義了這個BTree頁的格式。葉leaf標志意味著這一頁沒有孩子children。zerodata0數據表示這一頁只含有key,沒有數據;intkey標志意味著key是一個整數,而且是被存儲在格cell首部的key大小處,而不是在有效負荷區(qū)域。

格cell指針數組從頁首部開始。格cell指針數組包含0個或多余2個字節(jié)的數字,這個數字代表格cell內容區(qū)域中的格cell內容從文件起始位置的偏移量。格cell指針式有序的。系統(tǒng)盡力保證空閑空間位于最后一個格cell指針之后,這樣可以保證新的格cell可以很快的添加,而不用重新整理(defragment)這一頁。

格cell內容存儲在頁的末尾,且是向文件的起始方向增長。

在格cell內容區(qū)域中的未使用的空間被收集到鏈表freeblocks上。每一個freeblock至少有4個字節(jié)。第一個freeblock的偏移在頁首部給出了。Freeblock是增序的。因為一個freeblock至少有4個字節(jié),所有在格cell內容區(qū)域的3個或是哦啊與3個的未用空間不能存在于freeblock鏈表上。這些3個或少于3個的空閑空間被稱為碎片。所有碎片的總個數被記錄下來,存儲于頁首部的偏移7的位置。

** SIZE DESCRIPTION
** 2 Byte offset of the next freeblock
** 2 Bytes in this freeblock
**

格cell是可變長度的。格cell被存儲于頁的末尾格cell內容區(qū)域。指向格cell的cell指針數組緊跟在頁首部的后面。格cell不必是連續(xù)或者有序的,但是格cell指針是連續(xù)和有序的。

格cell內容充分利用了可變長度整數。可變長度整數是從1到9個字節(jié),每個字節(jié)的低7位被使用。整個整數由8位的字節(jié)組成,其中第一個字節(jié)的第8位被清零。整數最重要的字節(jié)出現在第一個。可變長度整數一般不多于9個字節(jié)。作為一種特殊情況,第九個字節(jié)的所有8個字節(jié)都會被認為是數據。這就允許了64位整數變編碼為9個字節(jié)。
** 0x00 becomes 0x00000000
** 0x7f becomes 0x0000007f
** 0x81 0x00 becomes 0x00000080
** 0x82 0x00 becomes 0x00000100
** 0x80 0x7f becomes 0x0000007f
** 0x8a 0x91 0xd1 0xac 0x78 becomes 0x12345678
** 0x81 0x81 0x81 0x81 0x01 becomes 0x10204081
本篇文章來源于 Linux公社網站(www.ythuaji.com.cn) 原文鏈接:http://www.ythuaji.com.cn/Linux/2012-11/75009.htm

延伸 · 閱讀

精彩推薦
  • SqliteSQLite中的WAL機制詳細介紹

    SQLite中的WAL機制詳細介紹

    這篇文章主要介紹了SQLite中的WAL機制詳細介紹,本文講解了什么是WAL、WAL如何工作、WAL的優(yōu)點與缺點、WAL引入的兼容性問題、WAL引入的性能問題等內容,需要...

    dodo83402020-06-08
  • Sqlite基于sqlite特殊字符轉義的實現方法

    基于sqlite特殊字符轉義的實現方法

    本篇文章是對sqlite特殊字符轉義的實現方法進行了詳細的分析介紹,需要的朋友參考下 ...

    sqlite數據庫教程網4132020-06-04
  • SqliteSQLite中重置自動編號列的方法

    SQLite中重置自動編號列的方法

    這篇文章主要介紹了SQLite中重置自動編號列的方法,本文講解了3種情況和其對應解決方法,需要的朋友可以參考下 ...

    dodo84492020-06-08
  • Sqlite詳解SQLite中的查詢規(guī)劃器

    詳解SQLite中的查詢規(guī)劃器

    這篇文章主要介紹了詳解SQLite中的查詢規(guī)劃器,SQLite是一個開源的嵌入式數據庫,需要的朋友可以參考下...

    SQLite教程網8892021-10-25
  • SqliteSQLite 內存數據庫學習手冊

    SQLite 內存數據庫學習手冊

    這篇文章主要介紹SQLite 內存數據庫的使用方法, 需要的朋友可以參考下 ...

    SQLite教程網3292020-06-06
  • SqliteSQLite速度評測代碼

    SQLite速度評測代碼

    SQLite 作為一個輕量級嵌入式數據庫,還是非常好用的。雨痕極力推薦~~~~~~ ...

    SQLite教程網5832020-06-01
  • SqliteSQLite 錯誤碼整理

    SQLite 錯誤碼整理

    這篇文章主要介紹了SQLite 錯誤碼,方便大家在開發(fā)過程中快速解決問題 ...

    SQLite教程網5532020-06-06
  • SqliteSQLite 入門教程三 好多約束 Constraints

    SQLite 入門教程三 好多約束 Constraints

    在上一篇隨筆的結尾,我提到了SQLite的約束, 但是在那里我把它翻譯成了限定符,不太準確,這里先更正一下,應該翻譯成約束更貼切一點。 那么什么是...

    SQLite入門教程4572020-06-05
主站蜘蛛池模板: 青青青国产在线 | 四虎在线视频免费观看视频 | 海派甜心完整版在线观看 | 91久久夜色精品国产九色 | 小早川怜子在线播放精品 | 精品视频在线播放 | free性丰满hd性欧美厨房 | 精品女同一区二区三区免费站 | 色老板在线 | 91色在线观看国产 | 91精品婷婷国产综合久久8 | 2015台湾永久免费平台 | 久久亚洲精品AV成人无码 | 四虎国产欧美成人影院 | 奇米久草 | 成年人免费观看的视频 | 婷婷久久热99在线精品 | 天天做天天玩天天爽天天 | 国产一区二区免费在线 | 满溢游泳池免费土豪全集下拉版 | 欧美一区二区三区综合色视频 | 护士让我吃奶我扒她奶 | 性刺激欧美三级在线现看中文 | haodiaose在线精品免费视频 | 大团圆免费阅读全文 | 小黄文污到你湿 | 亚洲黄色天堂 | 欧美老骚| 国产在线98福利播放视频免费 | 爽好舒服宝贝添奶吻戏 | 免费观看欧美成人禁片 | 欧美最猛性xxxxx动态图 | 国产成人亚洲综合91精品555 | 白丝美女同人18漫画 | 九九99九九精彩网站 | 操碰91| 99久久精品久久久久久清纯 | 青青操在线播放 | 久久永久视频 | 国产成人一区二区三区 | 亚飞与亚基国语1080p在线观看 |