為什麼磁碟存儲用樹結構
❶ mysql索引的數據結構,為什麼用b+樹
B+ 樹是對 B 樹的一個小升級。大部分資料庫的索引都是基於 B+ 樹存儲的。MySQL 的 MyISAM 和 InnoDB 引擎的索引都是基於 B+ 樹存儲。
B+ 樹最大的幾個特點:
1. 非葉子節點只保留 KEY,放棄 DATA;
2. KEY 和 DATA一起,在葉子節點,並且保存為一個有序鏈表(正序,反序,或者雙向);
3. B+ 樹的查找與 B 樹不同,當某個結點的 KEY 與所查的 KEY 相等時,並不停止查找,而是沿著這個 KEY 左邊的指針向下,一直查到該關鍵字所在的葉子結點為止。
❷ windows中為什麼採用樹型目錄結構管理文件
引它有些用戶為了防止他人進入自己建立的子目錄,將硬碟下的目錄名定義為含有ASCll碼128以外的不可視字元,即在建立於目錄時.按住ALT懂不放,利用小鍵盤上的數字鍵籍人不可視字元的ASCll碼(如178,223等),然後再松開ALT#這一方法.用著越來越多的用戶熟悉並掌握這種手段,硬碟上越來越多的於目錄也被保護起來,給機器的管理員帶來了不便.雖然用DEBUG、PCTOOLS和NORTON等軟體工具可以進入目錄區,對這些目錄重新命名,但較煩瑣,而且,稍有不慎,極易近成員據的丟失;有一種採用DIR命令的輸出改向符的方法,雖然可以同時對多個子目錄重新命名,但每次只能對一個目錄下的子目錄改名,而且要先將此目錄下的所有文件名和目錄名讀出,形成批處理文件.再在文件中刪除其它文件名和正常的目錄名,然盾才能實行改名操作,這樣,對於樹形目錄結構的情況,其效率較低.本文提出一種效率更高、更安全的方法:利用程序將一隻磁碟上所有不可視的目錄名一次住全部更
❸ 簡述磁碟文件目錄的結構和種類
文件目錄結構包含:文件名、文件內部標識、文件的類型、文件存儲地址、文件的長度、訪問許可權、建立時間和訪問時間等內容。
文件目錄分為一級目錄、二級目錄和多級目錄。多級目錄結構也稱為樹形結構,在多級目錄結構中,每一個磁碟有一個根目錄,在根目錄中可以包含若乾子目錄和文件,在子目錄中不但可以包含文件,而且還可以包含下一級子目錄,這樣類推下去就構成了多級目錄結構。
(3)為什麼磁碟存儲用樹結構擴展閱讀
文件目錄是為實現「按名存取」,必須建立文件名與輔存空間中物理地址的對應關系,體現這種對應關系的數據結構稱為文件目錄。每一個文件在文件目錄中登記一項,作為文件系統建立和維護文件的清單。
一個計算機系統中有成千上萬個文件,為了便於對文件進行存取和管理,計算機系統建立文件的索引,即文件名和文件物理位置之間的映射關系,這種文件的索引稱為文件目錄。
採用多級目錄結構的優點是用戶可以將不同類型和不同功能的文件分類儲存,既方便文件管理和查找,還允許不同文件目錄中的文件具有相同的文件名,解決了一級目錄結構中的重名問題。Windows、UNIX、Linux和DOS等操作系統採用的是多級目錄結構。
❹ 顯示磁碟上為什麼是(樹)形目錄結構怎麼不說它是這個(豎)形呢它的目錄結構不像樹啊,為什麼說是樹
這是沿用英文「tree」。
❺ 理解 B+樹
B+樹是為磁碟和存儲工具設計的一種數據結構,它是一種平衡查找樹,它在查找,插入、修改方面的時間復雜度都穩定為 O(logn)
<center>圖(1)</center>
B+樹節點是一組按照key有序的元素,B+樹包含兩種類型的節點,一種是索引節點,一種是葉子節點
B+樹使用填充因子來控制頁面的分裂和合並,設置數據佔用頁面空間的百分比,目的是為後面的數據預留一部分頁空間,當有新數據時,可以放到預留的頁空間中,避免分頁的發生
默認的填充因子是50%,對於一棵m階的B+樹,填充因子是 m/2
B+樹常用操作涉及到查詢、插入、刪除、范圍查詢, 為了便於說明,下面所有操作的例子中的B+樹無特殊說明都是5階樹
每個頁面最多有4個key,大於等於5個時就需要分裂或者旋轉合並
填充因子默認是50%,頁面中已經使用了的數量為2表示填充因子為50%,同理,小於2時候表示填充因子小於50%,大於2時候表示填充因子大於50%
B+樹的索引節點是有序的,查詢單個key的話直接用二分查找定位到目標葉子頁面,在目標葉子頁面中順序遍歷,找到目標key,則返回葉子頁面中目標key對應的數據
B+樹的插入操作完成以後,有以下幾種情況
這種情況插入操作步驟最少,根據key把數據插入到葉節點已經排序的位置上即可,下圖中是插入key為 23的數據,23會插入到包含 15, 21 的葉子頁面中,插入之後葉子頁面沒有滿,不用處理頁面分裂的情況
<center>圖(2)</center>
往圖(2) 的B+樹中插入key為28的數據,這條數據會插入到包含 15,21,23,27 的葉子頁面中,插入之後,該頁面數據已滿,必須要分裂成如下所示的兩個頁面:
中間行數據key為:23,放到上一層的索引頁面中15的後面,下面圖(3)是插入key為28的結果
<center>圖(3)</center>
<center>圖(4)</center>
圖(4) 的B+樹插入key為30的數據,這條數據會插入到 23, 27, 28, 29 的葉子頁面中,插入之後,該頁面數據已滿,必須要分裂成如下所示的兩個頁面:
中間行數據key為:28,放到索引頁面中23 的後面
28 放到索引頁面23的後面之後,索引頁變成了 4, 7, 15, 23, 28 , 這時索引頁也滿了,分裂成如下所示的三個頁面 :
下面圖(5)為插入key為30數據之後,葉子頁面和索引頁面分裂之後的結果:
<center>圖(5)</center>
B+樹的插入操作會有頁面分裂的情況,頁面分裂就會有產生磁碟IO,相對內存,磁碟 IO 要慢得多,所以為了減少磁碟IO操作,就要盡可能的減少頁面分裂,充分利用頁面空間,因此B+樹提供了旋轉操作
旋轉操作的應用場景: B+樹葉子頁面空間已經滿了,但是它的左右兄弟頁面沒有滿
葉子頁面空間滿了,B+樹會優先檢查左右兄弟葉子頁面是否能容納數據,當左右兄弟頁面空間都滿了時,才會考慮頁面分裂
<center>圖(6)</center>
圖(6)中,插入key為12的數據,葉子頁面空間滿了,這時B+樹先檢查左兄弟頁面是否有多餘的空間,通過旋轉,把key分別為 7, 10, 11, 12, 13 的葉子中的 7 移動到左兄弟頁面中,移動完成之後,左兄弟的key變成了 2, 5, 7
同時,葉子中key為7的數據在上層索引頁中也有記錄,所以需要把上層索引頁中key為7修改為 10,修改之後上層索引key分別為 10, 15 ,最終的結果如下圖(7)所示
<center>圖(7)</center>
葉子頁面插入新數據之後,頁面空間已滿,原本頁面時需要分裂的,但是通過把當前頁面上的數據移動到能容納數據的兄弟頁面中,減少了一次頁分裂,也即減少了一次磁碟IO操作
B+樹的刪除操作完成以後,有以下幾種情況
這種情況直接刪除節點,頁面會把刪除節點的位置標記為空,以便存放後續其他的數據,同時,如果刪除的key出現在上層的索引頁面中,需要用葉子頁面中被刪除節點的下一個節點key去替換它
<center>圖(8)</center>
圖(8)中 7是待刪除的節點,刪除7後,葉子頁面填充因子剛好等於50%,因為被刪除的7在上層的索引頁面中出現了相同的key,所以需要用葉子頁面中下一個key,也就是12替換上層索引頁面中的7,最終的結果如下面圖(9)所示:
<center>圖(9)</center>
葉子頁面填充因子小於50%的時候,為了維持B+樹的平衡,會有頁面數據轉移和合並的操作
當一個葉子頁面填充因子小於50%,左右兄弟頁面存在填充因子大於50%的時候,可以把兄弟頁面中的數據轉移到當前頁面中,上一層索引頁面中因葉子頁面數據轉移受影響的索引key也需要做相應的處理
如果左右兄弟頁面的填充因子都大於50%時,轉移任何一邊頁面數據到當前頁面都可以,雖然選擇不同的頁面轉移數據後,B+樹的形態不一樣,但是最終都是滿足B+樹特點的
<center>圖(10)</center>
上面圖(10)中,刪除key為16的數據 ( 圖中紅色標識的區域 ),刪除之後,原來key為 15, 16 的葉子頁面變成了 15 ,頁面只剩下一個key
此時頁面的填充因子小於50%,左兄弟頁面填充因子大於50%,滿足頁面數據轉移的條件
把左兄弟頁面 (key為 7, 12, 13 )中的 13 轉移到當前頁面中
轉移之後,兩個頁面key數量剛好等於填充因子,左兄弟頁面key變為 7, 12 ,當前頁面的key變為 13, 15
當前頁面中最小key值由原來的 15 變成了 13,為了保持B+數的平衡,需要把當前頁面上一層的索引頁面中key為15替換為13, 最終的結果如下面圖(11)所示 :
<center>圖(11)</center>
上面說明了從兄弟頁面轉移數據到當前頁面,現在我們來看下當前頁面數據量小於填充因子的時候,如何合並到兄弟頁面中
當一個葉子頁面填充因子小於50%,左右兄弟頁面存在填充因子等於50%的時候,可以把這個葉子頁面合並到左右兄弟頁面中,上一層索引頁面中因葉子頁面數據合並受影響的索引key也需要做相應的處理
<center>圖(12)</center>
在圖(12)中,執行刪除key為15的操作(圖中紅色區域),15位於key為 13, 15 的頁面中,刪除15之後,當前頁面key變成了 13 , 只剩下一個key了
此時,當前頁面填充因子小於50%,左右兄弟節點填充因子等於50%,所以無法從兄弟頁面轉移key數據到當前頁面,但滿足當前頁面數據合並到兄弟頁面的條件
左右兄弟頁面都滿足當前頁面數據合並過去,選擇任一兄弟頁面都可以,雖然選擇不同兄弟頁面,會導致B+樹的形態也不一樣,但最終都是讓B+樹維持平衡,這里我們選則合並到左兄弟頁面
15 被刪除了之後,當前頁面只剩下key為 13 的數據了
它合並到左兄弟頁面之後, 當前頁面為空,需要移除上一層索引頁面中指向當前頁面的索引key 13, 移除13的索引key之後, 索引頁面key由原來的 7, 13, 23 變成 7, 23
合並之後,左兄弟頁面key由原來的 7, 12 變成 7, 12, 13
最終的結果如下面 圖(13) 所示 :
<center>圖(13)</center>
當葉子頁面和索引頁面填充因子都小於50%的時候,葉子頁面和索引頁面都會有數據轉移或者合並的操作
<center>圖(14)</center>
在圖(14)中,執行刪除葉子頁面中key為12的數據(圖中紅色區域),12 位於key為 7, 12 葉子頁面中,刪除 12 之後,當前葉子頁面變成了 7 ,只剩下一個key了
當前葉子頁面左右兄弟頁面填充因子都是50%,所以滿足合並的條件,合並到左兄弟頁面或右兄弟頁面都可以,這里我們選擇合並到左兄弟頁面
當前葉子頁面中key為 7 的數據合並到左兄弟頁面之後,當前葉子頁面沒數據了,而左兄弟頁面key變成了 2, 5, 7
為了保持B+樹的平衡,指向當前葉子頁面的上一層索引頁面中,需要刪除key為 7 的索引key, 刪除key為7的索引後,索引頁面key變成了 15 , 這時該索引頁面填充因子小於50%,右兄弟頁面填充因子等於50%,滿足合並的條件
但是,索引頁面數據合並到右兄弟頁面之後,根節點的左子樹就為空了,為了保持B+樹的平衡,根頁面數據需要合並到下一層的索引頁面中
最後的結果如下面圖(15)所示 :
<center>圖(15)</center>
B+樹的葉子節點是按照key從小到大的順序組成的一個雙向鏈表,所以B+樹非常適合范圍查詢(這里說的范圍是B+樹中索引節點的key的范圍)
使用二分查找首先確定范圍查詢的起始key所在的葉子節點的位置,然後順序遍歷葉節點鏈表,直到葉節點key大於范圍查詢結束key,查詢停止
一顆 m 階的B+樹,索引節點存儲的是索引信息,為了計算方便,這里假設一個索引key信息 8 位元組,一個磁碟頁面大概 4K,那麼一個磁碟頁面能容納的索引數量為: 4 * 1024 / 8 = 512 ,此時 m 就等於 512
從上面的數據可以看到,B+樹高度為5時,
能容納 687 億個索引信息,可以非常夠用了
在實際的應用當中,B+樹的根節點都是緩存在內存中的,樹的最底層時葉子節點
所以針對高度為5的B+樹,查找一條指定key值的數據最多隻需要3次磁碟IO就能定位到具體的葉子頁面,當樹高度為4時,最多隻需要2次磁碟IO就能定位到具體的葉子頁面
B+樹主要用於磁碟和存儲工具,著名的MySQL引擎 InnoDB 索引的數據模型使用的就是 B+ 樹
當數據超過一定的量級的時候,為了快速檢索數據而設置的索引信息也會變得非常龐大,而且這部分索引信息只能存儲在磁碟中,B+樹能從磁碟中快速檢索到需要的數據,並且時間復雜度穩定在O(logn)
❻ 為什麼文件存儲要選用B+樹這樣的數據結構
您好,我來為您解答:
因為要降低搜索一個文件的時候,IO的次數。
比如一個1000度的B樹,磁碟上面有10億個文件的話,B樹只需要 4 次就好了。其他的數據結構做不到。
磁碟很慢,當涉及到磁碟的輸入輸出的時候,CPU的時間就已經可以忽略不計了,數據結構的設計要集中考慮到盡可能降低IO的次數,所以B樹應運而生。
如果我的回答沒能幫助您,請繼續追問。
❼ mysql索引的數據結構,為什麼用b+樹
談到索引,大家並不陌生。索引本身是一種數據結構,存在的目的主要是為了縮短數據檢索的時間,最大程度減少磁碟 IO。
任何有數據的場景幾乎都有索引,比如手機通訊錄、文件系統(ext4xfs tfs)、資料庫系統(MySQLOracle)。資料庫系統和文件系統一般都採用 B+ 樹來存儲索引信息,B+ 樹兼顧寫和讀的性能,最極端時檢索復雜度為 O(logN),其中 N 指的是節點數量,logN 表示對磁碟 IO 掃描的總次數。
MySQL 支持的索引結構有四種:B+ 樹,R 樹,HASH,FULLTEXT。
B 樹是一種多叉的 AVL 樹。B-Tree 減少了 AVL 數的高度,增加了每個節點的 KEY 數量。
B 樹的特性:(m 為階數:結點的孩子個數最大值)
1. 樹中每個節點最多含有 m 個孩子節點 (m>=2);
2. 除根節點和葉子結點外,其他節點的孩子數量 >=ceil(m / 2);
3.若根節點不是葉子結點,最少有兩個孩子
特殊情況:沒有孩子的根結點,即根結點為葉子結點,整棵樹只有一個根節點;
Ki (i=1...n) 為關鍵字,且關鍵字按順序升序排序 K(i-1)< Ki
Pi 為指向兒子節點的指針,且指針 P(i-1) 指向的兒子節點里所有關鍵字均小於 Ki,但都大於 K(i-1)
關鍵字的個數 n 必須滿足:[ceil(m / 2)-1]<= n <= m-1
如果一個結點有 n 個關鍵字,那麼該結點有 n+1 個分支。這 n+1 個關鍵字按照遞增順序排列
所有葉子結點都出現在同一層,是所有遍歷的終點位置
4. 每個非葉子結點中包含有 n 個關鍵字信息:(n,P0,K1,P1,K2,P2,......,Kn,Pn) 其中: