數據庫系列--數據庫底層索引原理:索引數據結構 B+樹

1、什麼是索引

 

在關係數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。

索引是爲了加速對錶中數據行的檢索而創建的一種分散的存儲結構。索引是針對表而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。

在數據庫系統中建立索引主要有以下作用:

(1)快速取數據;

(2)保證數據記錄的唯一性;

(3)實現表與表之間的參照完整性;

(4)在使用ORDER by、group by子句進行數據檢索時,利用索引可以減少排序和分組的時間。

優點

1.大大加快數據的檢索速度;

2.創建唯一性索引,保證數據庫表中每一行數據的唯一性;

3.加速表和表之間的連接;

4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。

 

缺點

1.索引需要佔物理空間。

2.當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度。

 

2、索引的數據結構

B樹、哈希表、R樹    

B樹(B-tree):數據存儲時有序的,靈活。B-樹結構支持插入、控制操作以及通過管理一系列樹根狀結構的彼此聯通的節點中來做選擇。B-樹結構中有兩種節點類型:索引節點和葉子節點。葉子節點是存儲數據的,而索引節點是用來告訴用戶存儲在葉子節點中的數據的順序,並幫助用戶找到數據。B-樹不是二叉樹,二叉樹只是一種簡單的節點層次結構的實現。

特點:m階代表一個樹節點最多有多少個查找路徑,m階=m路,當m=2則是2叉樹,m=3則是3叉。上圖最多是3,所以是3叉

1、是一個平衡多叉樹(二叉排序樹(二叉搜索樹)+左右兩個子樹的高度差的絕對值不超過1)一個父親節點下有多個子節點,子節點個數=父節點內的關鍵字個數+1

2、子節點個數=父節點內的關鍵字個數+1。因爲父節點的關鍵字是子節點的索引。每個結點中關鍵字從小到大排列,並且當該結點的孩子是非葉子結點時,該k-1個關鍵字正好是k個孩子包含的關鍵字的值域的分劃。

3、所有的葉子節點都出現在同一層,且有指向下一層的指針,只不過是null

4、節點中的關鍵信息是從小到大排列的

轉載:

平衡二叉樹、B樹、B+樹、B*樹 理解其中一種你就都明白了

https://zhuanlan.zhihu.com/p/27700617

B+樹:

 

B+-tree:是應文件系統所需而產生的一種B-tree的變形樹。

一棵m階的B+樹和m階的B樹的異同點在於:

      1.有n棵子樹的結點中含有n-1 個關鍵字; (此處頗有爭議,B+樹到底是與B 樹n棵子樹有n-1個關鍵字 保持一致,還是不一致:B樹n棵子樹的結點中含有n個關鍵字,待後續查證。暫先提供兩個參考鏈接:①wikipedia http://en.wikipedia.org/wiki/B%2B_tree#Overview;②http://hedengcheng.com/?p=525。而下面B+樹的圖尚未最終確定是否有問題,請讀者注意)

      2.所有的葉子結點中包含了全部關鍵字的信息,及指向含有這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大的順序鏈接。 (而B 樹的葉子節點並沒有包括全部需要查找的信息)

      3.所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。 (而B 樹的非終節點也包含需要查找的有效信息)

 

 


B*樹:

B*-tree是B+-tree的變體,在B+樹的基礎上(所有的葉子結點中包含了全部關鍵字的信息,及指向含有這些關鍵字記錄的指針),B*樹中非根和非葉子結點再增加指向兄弟的指針;B*樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3(代替B+樹的1/2)。給出了一個簡單實例,如下圖所示:

轉載: (JULY)從B樹、B+樹、B*樹談到R 樹https://blog.csdn.net/v_JULY_v/article/details/6530142/

哈希:存儲是無順序的,適合查具體的值

R樹:R-Tree作爲數據結構的索引通常用來爲空間問題提供幫助    

    

R樹在數據庫等領域做出的功績是非常顯著的。它很好的解決了在高維空間搜索等問題。舉個R樹在現實領域中能夠解決的例子:查找20英里以內所有的餐廳。如果沒有R樹你會怎麼解決?一般情況下我們會把餐廳的座標(x,y)分爲兩個字段存放在數據庫中,一個字段記錄經度,另一個字段記錄緯度。這樣的話我們就需要遍歷所有的餐廳獲取其位置信息,然後計算是否滿足要求。如果一個地區有100家餐廳的話,我們就要進行100次位置計算操作了,如果應用到谷歌地圖這種超大數據庫中,這種方法便必定不可行了。

R樹就很好的解決了這種高維空間搜索問題。它把B樹的思想很好的擴展到了多維空間,採用了B樹分割空間的思想,並在添加、刪除操作時採用合併、分解結點的方法,保證樹的平衡性。因此,R樹就是一棵用來存儲高維數據的平衡樹。

 

HashTree(轉載:https://blog.csdn.net/yang_yulei/article/details/46337405)

 

我們選擇質數分辨算法來建立一棵哈希樹。
選擇從2開始的連續質數來建立一個十層的哈希樹。第一層結點爲根結點,根結點下有2個結點;第二層的每個結點下有3個結點;依此類推,即每層結點的子節點數目爲連續的質數。到第十層,每個結點下有29個結點。
同一結點中的子結點,從左到右代表不同的餘數結果。
例如:第二層結點下有三個子節點。那麼從左到右分別代表:除3餘0,除3餘1,除3餘2.
對質數進行取餘操作得到的餘數決定了處理的路徑。
 

結點結構:結點的關鍵字(在整個樹中是唯一的),結點的數據對象,結點是否被佔據的標誌位(標誌位爲真時,關鍵字才被認爲是有效的),和結點的子結點數組。

 

3、sqlserver數據存儲結構

SQL Server數據庫存儲(結構)的最小單位是頁,大小爲8K,共8 * 1024 = 8192Byte,不論是數據頁還是索引頁都是以此方式存放

 

表中所有數據頁的存放在磁盤上又有兩種組織方式:

  • 堆表;
  • 索引組織表

  如果表中所有數據頁是以一種頁間無序、隨機存儲的方式,則稱這樣的表爲堆表;

  否則如果表中數據頁間按某種方式(如表中某個字段)有序地存儲與磁盤上,則稱爲索引組織表。

 

平衡二叉樹

 

B樹、B-樹、B+樹與紅黑樹

https://blog.csdn.net/qq_17612199/article/details/50944413

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章