1. 程式人生 > >資料庫檢索 索引之--- B 樹

資料庫檢索 索引之--- B 樹

 B樹索引是一個典型的樹結構,始終是平衡的,也就是說 從Root節點到 Leaf 節點的任何一個路徑都是等距離的。其包含的元件主要是:             葉子節點(Leaf node):包含條目直接指向表裡的資料行。             分支節點(Branch node):包含的條目指向索引裡其他的分支節點或者是葉子節點。             根節點(Branch node):一個B樹索引只有一個根節點,它實際就是位於樹的最頂端的分支節點。


對於分支節點塊(包括根節點塊)來說,其所包含的索引條目都是按照順序排列的(可以指定reverse,倒序)。每個索引條目(也可以叫做每條記錄)都具有兩個欄位。第一個欄位表示當前該分支節點塊下面所連結的索引塊中所包含的最小鍵值(按B+tree最小鍵值複製原則);第二個欄位為四個位元組,表示所連結的索引塊的地址,該地址指向下面一個索引塊。在一個分支節點塊中所能容納的記錄行數由資料塊大小以及索引鍵值的長度決定。
      對於葉子節點塊來說,其所包含的索引條目與分支節點一樣,都是按照順序排列的(預設是升序排列,也可以在建立索引時指定為降序排列)。每個索引條目(也可以叫做每條記錄)也具有兩個欄位。第一個欄位表示索引的鍵值,對於單列索引來說是一個值;而對於多列索引來說則是多個值組合在一起的。第二個欄位表示鍵值所對應的記錄行的ROWID,該ROWID是記錄行在表裡的實體地址。在葉子節點中,每個索引條目都會在資料塊中佔一行空間。每一行用2到3個位元組作為行頭,行頭用來存放標記以及鎖定型別等資訊。同時,在第一個表示索引的鍵值的欄位中,每一個索引列都有1個位元組表示資料長度,後面則是該列具體的值。  www.2cto.com         下面分別把分支節點的索引結構和葉子節點的索引資訊dump出來       建立測試資料
    檢視索引的Blevel、height(blevel:節點的深度。root位於第0層,以此類推。height=blevel+1) [sql]
[email protected]
> select index_name,blevel from dba_indexes where index_name='BTREE_TT';      INDEX_NAME                         BLEVEL   ------------------------------ ----------   BTREE_TT                                2      [email protected]> analyze index btree_tt validate structure;      Index analyzed.    www.2cto.com     
[email protected]
> select name,height from index_stats where name='BTREE_TT';      NAME                               HEIGHT   ------------------------------ ----------   BTREE_TT                                3         獲得btree_tt的物件號,進行索引結構的dump [sql] [email protected]> select object_id from dba_objects where owner='SYS' and object_name='BTREE_TT';       OBJECT_ID   ----------        52614      [email protected]> oradebug setmypid   Statement processed.   [email protected]> alter session set events 'immediate trace name treedump level 52614';       www.2cto.com   Session altered.      [email protected]> oradebug tracefile_name   /u01/app/oracle/admin/orcl/udump/orcl_ora_5234.trc         檢視treedump trc檔案 [sql] ----- begin tree dump   branch: 0x40efaa 4255658 (0: nrow: 2, level: 2)      branch: 0x40f603 4257283 (-1: nrow: 247, level: 1)         leaf: 0x40efab 4255659 (-1: nrow: 182 rrow: 182)         leaf: 0x40efac 4255660 (0: nrow: 182 rrow: 182)         leaf: 0x40efad 4255661 (1: nrow: 186 rrow: 186)         leaf: 0x40efae 4255662 (2: nrow: 189 rrow: 189)         leaf: 0x40efaf 4255663 (3: nrow: 186 rrow: 186)         leaf: 0x40efb0 4255664 (4: nrow: 190 rrow: 190)         leaf: 0x40efb1 4255665 (5: nrow: 185 rrow: 185)         leaf: 0x40efb2 4255666 (6: nrow: 179 rrow: 179)         leaf: 0x40efb3 4255667 (7: nrow: 187 rrow: 187)         leaf: 0x40efb4 4255668 (8: nrow: 181 rrow: 181)         ............................................         ............................................      branch: 0x40f6fb 4257531 (0: nrow: 248, level: 1)         leaf: 0x40f602 4257282 (-1: nrow: 228 rrow: 228)         leaf: 0x40f604 4257284 (0: nrow: 226 rrow: 226)         leaf: 0x40f605 4257285 (1: nrow: 224 rrow: 224)         leaf: 0x40f606 4257286 (2: nrow: 223 rrow: 223)         leaf: 0x40f607 4257287 (3: nrow: 217 rrow: 217)         leaf: 0x40f608 4257288 (4: nrow: 253 rrow: 253)         leaf: 0x40f609 4257289 (5: nrow: 232 rrow: 232)         ............................................         ............................................         leaf: 0x40f6f8 4257528 (244: nrow: 191 rrow: 191)         leaf: 0x40f6f9 4257529 (245: nrow: 181 rrow: 181)         leaf: 0x40f6fa 4257530 (246: nrow: 99 rrow: 99)   ----- end tree dump    www.2cto.com         解釋trc檔案     每一行第一列表示:節點型別,branch是分支節點(包括了根節點),而leaf則是葉子節點                第二列表示:節點地址,16進位制                第三列表示:節點地址,10進位制                第四列表示:相對於前一個節點的位置:根節點從0算起,其他分支節點和葉子節點從1開始算                第五列表示:(nrow)當前節點所含索引條目的數量(包括delete的條目)                第六列表示:(level)分支節點的層級,在oracle的索引中,層級號是倒過來的,也就是說假設某個索引有N層,則根節點的層級號為N,而根節點下一層的分支節點的層級號為N-1                第七列表示:(rrow)有效的索引條目的數量,因為索引條目如果被刪除,不會立即被清除出索引塊中。所以nrow減rrow的數量就表示已經被刪除的索引條目數量       上面這種方式以樹狀形式轉儲整個索引。同時,我們可以轉儲一個索引節點來看看其中存放了些什麼。     下面轉儲根節點的索引塊內容。     從trc檔案可知:根節點branch: 0x40efaa 4255658 (0: nrow: 2, level: 2) [sql] [email protected]> select dbms_utility.data_block_address_file(4255658 ) fno,     2              dbms_utility.data_block_address_block(4255658 ) bno     3         from dual;             FNO        BNO   ---------- ----------            1      61354      [email protected]> alter system dump datafile 1 block 61354;       www.2cto.com   System altered.      [email protected]> oradebug tracefile_name   /u01/app/oracle/admin/orcl/udump/orcl_ora_5234.trc         檢視root節點的trc內容 [sql] header address 230057028=0xdb66444   kdxcolev 2   KDXCOLEV Flags = - - -   kdxcolok 0   kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y   kdxconco 2   kdxcosdc 0   kdxconro 1   kdxcofbo 30=0x1e   kdxcofeo 8026=0x1f5a   kdxcoavs 7996   kdxbrlmc 4257283=0x40f603   kdxbrsno 0   kdxbrbksz 8056    kdxbr2urrc 0   row#0[8026] dba: 4257531=0x40f6fb   col 0; len 18; (18):  41 4c 4c 5f 43 4f 4c 5f 50 52 49 56 53 5f 4d 41 44 45   col 1; len 6; (6):  00 40 ee c5 00 2c    www.2cto.com   ----- end of branch block dump -----         kdxcolev 表示:索引層級號,我們這個例子中,根節點的level是2,葉子該是0     kdxcolok 表示:該索引上是否有DML活動事務     kdxconco 表示:索引條目中列的數量     kdxcosdc 表示:索引結構發生變化的數量,當你修改某個索引鍵值時,該值加1     kdxconro 表示:當前索引節點中索引條目的數量     kdxcofbo 表示:當前索引節點從第幾個位元組開始記錄     kdxcofeo 表示:當前索引節點可用空間的最尾端在哪個位元組     kdxcoavs 表示:當前索引節點可用空間總量。也就是kdxcofeo - kdxcofbo 的值     kdxbrlmc 表示:分支節點的位置     kdxbrsno 表示:最後一個被修改的索引條目號,這裡為0,表明是新建索引     kdxbrbksz 表示:可用資料塊大小,從這裡我們可以知道,即便pctfree為0,對於8k資料塊,我們也不能完全用完 [sql] row#0[8026] dba: 4257531=0x40f6fb   col 0; len 18; (18):  41 4c 4c 5f 43 4f 4c 5f 50 52 49 56 53 5f 4d 41 44 45   col 1; len 6; (6):  00 40 ee c5 00 2c         這部分內容就是根節點裡面記錄的索引條目,總共1行(在B+樹的定義裡,如果按最小關鍵碼複寫原則,則樹中每個非葉子節點中有m棵子樹必有m-1個關鍵碼)。每個索引條目都指向一個分支節點,其中,col 1表示所連結的分支節點的地址,如果根節點下沒有其他的分支節點,則col 1為TERM;col 0表示該分支節點所連結的最小鍵值。注意一點,這裡的col 0; len 18; (18):--列的行號,從0開始,緊接著的就是列的長度以及列的值,那麼這個值稱之為separator key,這個separator key 可以區分真實的索引值,所以從這裡我們也知道 branch block不會儲存完整的索引值,只要能區分就行。也就是說,Oracle在 Branch block中只記錄 索引鍵值的字首,而不是所有值,是因為這樣可以節約空間,從而能夠儲存更多的索引條目。同時,我們也能理解了為什麼 查詢使用 like '%xxx' 這種方法不會走Btree 索引,因為Branch block 儲存的是字首。    www.2cto.com       下面轉儲葉子節點塊的內容     隨便選一葉:leaf: 0x40f6fa 4257530 (246: nrow: 99 rrow: 99) [sql] [email protected]> select dbms_utility.data_block_address_file(4257530) fno,     2              dbms_utility.data_block_address_block(4257530) bno     3         from dual;             FNO        BNO   ---------- ----------            1      63226      [email protected]> oradebug setmypid   Statement processed.   [email protected]> alter system dump datafile 1 block 63226;   [email protected]> oradebug tracefile_name   /u01/app/oracle/admin/orcl/udump/orcl_ora_6177.trc         葉子節點的部分內容摘入如下: [sql] Block header dump:  0x0040f6fa    Object id on Block? Y    seg/obj: 0xcd86  csc: 0x00.a3506  itc: 2  flg: -  typ: 2 - INDEX        fsl: 0  fnx: 0x0 ver: 0x01        Itl           Xid                  Uba         Flag  Lck        Scn/Fsc   0x01   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000   0x02   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn 0x0000.000a3506        www.2cto.com   Leaf block dump   ===============   header address 221234268=0xd2fc45c   kdxcolev 0   KDXCOLEV Flags = - - -   kdxcolok 0   kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y   kdxconco 2   kdxcosdc 0   kdxconro 99   kdxcofbo 234=0xea   kdxcofeo 4692=0x1254   kdxcoavs 4458   kdxlespl 0   kdxlende 0   kdxlenxt 0=0x0   kdxleprv 4257529=0x40f6f9   kdxledsz 0   kdxlebksz 8032   row#0[7992] flag: ------, lock: 0, len=40   col 0; len 30; (30):     73 75 6e 2f 74 6f 6f 6c 73 2f 74 72 65 65 2f 53 77 69 74 63 68 53 74 61 74    65 6d 65 6e 74   col 1; len 6; (6):  00 40 f3 25 00 0a   row#1[7953] flag: ------, lock: 0, len=39   col 0; len 29; (29):     73 75 6e 2f 74 6f 6f 6c 73 2f 74 72 65 65 2f 54 68 69 73 45 78 70 72 65 73    73 69 6f 6e   col 1; len 6; (6):  00 40 f0 74 00 31   row#2[7914] flag: ------, lock: 0, len=39   col 0; len 29; (29):     73 75 6e 2f 74 6f 6f 6c 73 2f 74 72 65 65 2f 54 68 69 73 45 78 70 72 65 73    73 69 6f 6e    www.2cto.com   col 1; len 6; (6):  00 40 f0 74 00 32   ............................   ............................   row#97[4727] flag: ------, lock: 0, len=35   col 0; len 25; (25):   

相關推薦

資料庫檢索 索引--- B

 B樹索引是一個典型的樹結構,始終是平衡的,也就是說 從Root節點到 Leaf 節點的任何一個路徑都是等距離的。其包含的元件主要是:             葉子節點(Leaf node):包含

資料庫索引背後的資料結構B-B+

前言:索引結構有B樹索引、Hash索引、Fulltext索引等,關於樹結構的索引又分為B-Tree、B+Tree、B*Tree、R樹、R+樹等。本文重點探討B樹的前兩種結構。 資料庫查詢為什麼要使用索引   從理論上講,假設資料庫中的某一個表有10

深入理解資料庫索引採用BB+的原因

         前面幾篇關於資料庫底層磁碟檔案讀取,資料庫索引實現細節進行了深入的研究,但是沒有串聯起來的講解為什麼資料庫索引會採用B樹和B+樹而不是其他的資料結構,例如平衡二叉樹、連結串列等,因此,本文打算從資料庫檔案儲存以及讀取說起,講解資料庫索引的由來。      

【面試題】資料庫索引BB+詳解

最近準備找一個實習,所以接下來,會通過其他人分享的面經陸續的總結面試中經常遇到的題 今天是關於資料庫索引,以及具體的實現(B樹及B+樹) 本文參考自兩篇部落格(個人認為是最好的相關部落格了) 資料庫索引部分:http://blog.csdn.net/weilianglian

資料庫索引BB+,雜湊)

資料庫索引是儲存引擎用於快速找到記錄的一種資料結構。         《高效能MySQL》 一. 什麼是索引?   

面試總結(資料庫索引BB+

1.  資料庫系統維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。索引的實現通常使用B樹及其變種B+樹。        建立索引可以大大提高系統的效能。        第一、

資料庫索引為什麼B結構

這是一個很深的問題,我採用逐步問答的方式來解答。試圖用最簡潔的語言解決整體概念上的問題。本文目的純粹是提供對“索引採用B樹結構”這個問題的一種入門概念,不涉及深入的東西。 資料庫索引為什麼會選擇B樹結構?答:因為使用B樹查詢時,所用的磁碟IO操作次數比平衡二叉樹更少,效率

資料庫為什麼要用B+結構--MySQL索引結構的實現

為什麼使用B+樹?言簡意賅,就是因為: 1.檔案很大,不可能全部儲存在記憶體中,故要儲存到磁碟上 2.索引的結構組織要儘量減少查詢過程中磁碟I/O的存取次數(為什麼使用B-/+Tree,還跟磁碟存取原理有關。) 3.區域性性原理與磁碟預讀,預讀的長度一般為頁(page)的整

MySQL資料庫為什麼大多使用B+,而不是用Hash儲存索引

通常B+資料的查詢時間為log(n),而利用Hash時間為o(1),那為什麼還要用B+樹呢。 對於B+樹,相比於Hash好處: 1.利用Hash需要把資料全部載入到記憶體中,如果資料量大,是一件很消耗記憶體的事,而採用B+樹,是基於按照節點分段載入,由此減少記憶體消耗。 2.和業務場

為什麼資料庫索引使用B+實現

資料庫索引通常使用B樹及其變種B+樹。資料庫索引是資料庫管理系統中一個排序的資料結構,以協助快速查詢、更新資料庫表中資料。 為了弄清楚資料庫索引為B+樹的原因,我們先來介紹B+樹幾個“近親”。 1.二叉樹 二叉樹是每個結點只能有兩個子樹的樹結構。

資料儲存檢索B+和LSM-Tree

作為一名應用系統開發人員,為什麼要關注資料內部的儲存和檢索呢?首先,你不太可能從頭開始實現一套自己的儲存引擎,往往需要從眾多現有的儲存引擎中選擇一個適合自己應用的儲存引擎。因此,為了針對你特定的工作負載而對資料庫調優時,最好對儲存引擎的底層機制有一個大概的瞭解。 今天我們就先來了解下關係型資料庫MySQL和N

資料結構B+

title: 資料結構之B+樹 date: 2018-11-04 20:39:00 tags: 資料結構與演算法之美 一、 淺談B-樹索引 1.B-樹的特性 一棵m階B-樹,或者是空樹,或者是滿足以下性質的m叉樹 根結點至少有兩個分支; 除根以外的非葉結點,每個結點包含分支數範圍[[

演算法導論 B B- - 建立 插入 C語言

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

演算法導論 B - 刪除 C語言

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

資料結構B-

作為檔案系統索引的常用資料結構,B-樹的查詢涉及硬碟和記憶體兩個部分,硬碟的讀寫將影響查詢的速度。傳統關係型資料庫如Mysql採用B-樹作為索引,新型記憶體資料庫levledb通過改進資料組織方式通過記憶體訪問使得存取速度得到大幅提升,本文通過對B-樹樓據結構的特點及查詢演算法整理,後續將更新leveldb的

平衡搜尋B-

B-樹:     一種適合外查詢的平衡多叉樹(有些地方寫的是B-樹,注意不要誤讀 成"B減樹") 。 M階的B樹滿足如下性質:     1、根節點至少有兩個孩子; &nbs

資料結構BB+B*

1、應用背景 二叉查詢樹、AVL樹、紅黑樹等都屬於二叉樹的範圍,查詢的時間複雜度是O(log 2N),與樹的深度相關,那麼降低樹的深度自然會提高查詢效率。 但是我們面對這樣一個實際問題:大規模資料儲存中,樹節點儲存的元素數量是有限的(如果元素數量非常多的話,查詢就退化成節點內部的線性

高階搜尋B

【說明】部落格內容選自課件內容 目錄 1.B-樹的定義 B-樹是一種滿足以下特性的m叉動態搜尋樹: 1)根結點至少有兩個子樹; 2)除根結點外,所有內部結點至少有⌈m/2⌉ 個子樹,最多有 m 棵子樹; 3)所有外部結點位於同一

二叉B紅黑AVL堆積B-B+

B樹        即二叉搜尋樹:        1.所有非葉子結點至多擁有兩個子節點(Left和Right);        2.所有結點儲存一個關鍵字;        3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹;        如

演算法導論 B B-

                作者:鄒祁峰郵箱:[email protected]日期:2014.03.13 18:00轉載請註明來自"祁峰"的CSDN部落格1 引言  In computer science, a B-tree is a tree data structure that keep