国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

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

SQLite中的B-Tree實現細節分析

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

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

SQLite在存儲在外部的數據庫是以B-Tree來組織的。關于B-tree的細節,參考
**
** 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樹的一個節點。
----------------------------------------------------------------
| 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是樹的階數。內存中找不到了,就發生缺頁中斷。
主要是解決內存中找不到的問題。一方面換出來一些。一方面換進去一些。換進去的時候要找到他們再硬盤的哪個頁面上啊。
(B樹的優點就是適合于用塊兒存儲的存儲設備上。)利用所以,可以知道他們們在哪個頁面上。

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

格式細節
一個文件分成了多個頁。第一頁叫做頁1,第二頁叫做頁2,一次類推。頁的個數為0表示沒有頁。頁的大小可以從512 到 65536。每一頁或者是一個btree頁,或者是一個freelist頁,或者是一個溢出頁。
第一頁一定是一個btree頁。第一頁的前面100個字節包含了一個特殊的首部(文件頭),它是這個文件的描述。
文件頭的個數如下:
** OFFSET SIZE DESCRIPTION
** 0 16 Header string(首部字符串): "SQLite format 3\000"
** 16 2 Page size in bytes(頁的字節數).
** 18 1 File format write version(文件寫操作的版本)
** 19 1 File format read version (文件讀操作的版本)
** 20 1 Bytes of unused space at the end of each page(每一頁結尾未使用的字節)
** 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 (保留字節)
** 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中的葉節點。一個LEAFDATA的最大有效負荷分片為100%(或者是值255),它不用再首部指定。

BTree的每一頁被分為三部分:首部,格(cell)指針數組,和格cell的內容。頁1還會在頁首部有100字節的文件頭。
**
** |----------------|
** | 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大小處,而不是在有效負荷區域。

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

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

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

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

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

格cell內容充分利用了可變長度整數。可變長度整數是從1到9個字節,每個字節的低7位被使用。整個整數由8位的字節組成,其中第一個字節的第8位被清零。整數最重要的字節出現在第一個。可變長度整數一般不多于9個字節。作為一種特殊情況,第九個字節的所有8個字節都會被認為是數據。這就允許了64位整數變編碼為9個字節。
** 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.jfrwli.cn) 原文鏈接:http://www.jfrwli.cn/Linux/2012-11/75009.htm

延伸 · 閱讀

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

    SQLite中的WAL機制詳細介紹

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

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

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

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

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

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

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

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

    詳解SQLite中的查詢規劃器

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

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

    SQLite 內存數據庫學習手冊

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

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

    SQLite速度評測代碼

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

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

    SQLite 錯誤碼整理

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

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

    SQLite 入門教程三 好多約束 Constraints

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

    SQLite入門教程4572020-06-05
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产精品爱久久久久久久 | 日韩精品一区二区三区四区 | 中文字幕第一页在线 | 成人精品国产 | 国产精品二区一区二区aⅴ污介绍 | 国产在线视频一区 | 国产精品99 | 国产真实乱全部视频 | av中文字幕在线 | 最新国产在线视频 | 婷婷精品 | 欧美视频在线一区 | 国产在线观看91一区二区三区 | 欧美激情精品久久久久久黑人 | 永久免费av片在线观看全网站 | 亚洲精品一区二区 | 秋霞av亚洲一区二区三 | 中文字幕欧美日韩 | 国产精品美女久久久久久免费 | 国产欧美综合一区二区三区 | 91av在线播放| 国产精品亚洲一区二区三区在线 | 成人激情在线观看 | 婷婷色综合 | 国产 日韩 欧美 中文 在线播放 | 免费看一区二区三区 | 一区视频| 精品视频免费观看 | 无码一区二区三区视频 | 天天曰夜夜操 | 日韩高清在线一区二区三区 | a一级黄 | 日韩成人在线播放 | 亚洲精品www久久久久久广东 | 成人福利网站 | www.一区二区三区 | 激情久久久| 成人午夜在线播放 | 国产精品毛片久久久久久 | 精品免费在线 | 久久久久高清 |