四、聚集索引、非聚集索引
聚集索引:類似字典的拼音目錄
五、b樹與b+樹
二叉查詢樹的查詢時間複雜度是o(logn)
b樹和b+樹的的出現是因為磁碟io的問題,io操作的效率很低,那麼在大量資料儲存中,查詢時我們不能一下子將所有資料載入到記憶體中,只能逐一載入磁碟頁,每個磁碟頁對應樹的節點。造成大量磁碟io操作(最壞情況下樹的高度)。平衡二叉樹由於樹深度過大而造成磁碟io讀寫過於頻繁,進而導致效率低下。所以為了減少磁碟io次數,就必須降低樹的深度:
1)每個節點儲存多個元素
2)摒棄二叉樹結構,採用多叉樹
m階的b樹有以下幾個特徵:
三階b樹
第一次磁碟io:在記憶體中定位(與17、35比較),比17小,左子樹;
第二次磁碟io:在記憶體中定位(與8、12比較),比8小,左子樹;
第三次磁碟io : 在記憶體中定位(與3、5)比較,找到5,終止。
比較的次數並不比二叉樹少,但是io次數卻大大減少。比較是在記憶體中進行的,相比於磁碟io的速度,比較的耗時幾乎可以省略,所以樹的高度足夠低的話,就可以極大的提高效率,節點的元素增多只是多了幾次記憶體互動而已,只要不超過磁碟頁的大小即可。
對高度為k的m階b樹,新節點一般是插在葉子層。通過檢索可以確定關鍵碼應插入的結點位置,然後分情況討論:
b+樹是b樹的變種,有著比b樹更高的查詢效率。
乙個m階的b+樹具有如下幾個特徵:
b+樹通常有兩個指標,乙個指向根結點,另乙個指向關鍵字最小的葉子結點。因些,對於b+樹進行查詢兩種運算:一種是從最小關鍵字起順序查詢,另一種是從根結點開始,進行隨機查詢。
查詢b+樹的優勢在於查詢效率上,下面我們做一具體說明:
首先,b+樹的查詢和b樹一樣,類似於二叉查詢樹。起始於根節點,自頂向下遍歷樹,選擇其分離值在要查詢值的任意一邊的子指標。在節點內部典型的使用是二分查詢來確定這個位置。
(1)、不同的是,b+樹中間節點沒有衛星資料(索引元素所指向的資料記錄),只有索引,而b樹每個結點中的每個關鍵字都有衛星資料;這就意味著同樣的大小的磁碟頁可以容納更多節點元素,在相同的資料量下,b+樹更加「矮胖」,io操作更少
b樹的衛星資料:
b+樹的衛星資料:
需要補充的是,在資料庫的聚集索引(clustered index)中,葉子節點直接包含衛星資料。在非聚集索引(nonclustered index)中,葉子節點帶有指向衛星資料的指標。
(2)、其次,因為衛星資料的不同,導致查詢過程也不同;b樹的查詢只需找到匹配元素即可,最好情況下查詢到根節點,最壞情況下查詢到葉子結點,所說效能很不穩定,而b+樹每次必須查詢到葉子結點,效能穩定
(3)、在範圍查詢方面,b+樹的優勢更加明顯
b樹的範圍查詢需要不斷依賴中序遍歷。首先二分查詢到範圍下限,在不斷通過中序遍歷,知道查詢到範圍的上限即可。整個過程比較耗時。
而b+樹的範圍查詢則簡單了許多。首先通過二分查詢,找到範圍下限,然後同過葉子結點的鍊錶順序遍歷,直至找到上限即可,整個過程簡單許多,效率也比較高。
例如:同樣查詢範圍[3-11],兩者的查詢過程如下:
b樹的查詢過程:
b+樹的查詢過程:
插入b+樹的插入與b樹的插入過程類似。不同的是b+樹在葉結點上進行,如果葉結點中的關鍵碼個數超過m,就必須**成關鍵碼數目大致相同的兩個結點,並保證上層結點中有這兩個結點的最大關鍵碼。
刪除b+樹中的關鍵碼在葉結點層刪除後,其在上層的複本可以保留,作為乙個」分解關鍵碼」存在,如果因為刪除而造成結點中關鍵碼數小於ceil(m/2),其處理過程與b-樹的處理一樣。在此,我就不多做介紹了。
總結
資料庫學習(三)
修改欄位的順序 語法 alter table table name modify 列名 資料型別 first 例子 將tab dept表中的loc調整到第乙個位置 alter table tab dept modify loc varchar 50 first 將tab dept表中的num調整到d...
資料庫學習之三
decode的使用 多表,intersect交集 minus減集 union並集 union all 並集不去重 在表中將每一條資料看成乙個元素,元素的段必須相同 求薪水排名前6 10的人 採用decode函式 count計數函式 group by分組函式 掌握兩個表的連線方式 第乙個表的每一條資料...
資料庫學習二 資料庫設計三正規化
一.第一正規化 確保欄位的原子性 定義 表裡面的所有欄位都是原子的,不可拆分的。這裡面有兩個意思。一是可以拆封時,一定要拆分 二是不要亂拆分。student id 位址這樣的設計不符合原子性,我們在存放 位址 的時候,會插入乙個很長的字串。往往我們將 位址 劃分為更小的不可拆分的單位。修改某個位址時...