1、什么是索引
在關系型數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單(定義真特么拗口)。 大白話意思是索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
2、能作為索引的數據結構
數組,鏈表,哈希,紅黑樹, B樹(B+樹,B-樹);
哈希缺點:只能滿足查詢條件不變的情況,hash(id)=?,如果有聯合索引,比如hash(id,name),只傳了id,那么就會索引久會失效,還有不支持范圍查找
紅黑樹缺點:磁盤一頁數據可以讀16k,可能在查找了3次才能查到自己想要的數據,每一次查找都是讀取磁盤,導致讀取磁盤次數過多,讀取的內容也浪費很多。
b-tree:一個 m 階的B樹滿足以下條件:
每個結點至多擁有m棵子樹;
除了根結點以外,其余每個分支結點至少擁有 m/2 棵子樹;
根結點至少擁有兩顆子樹(存在子樹的情況下);
所有的葉結點都在同一層上,其可以看作是外部結點,不包含任何信息;
有 k 棵子樹的非葉子結點則其存在 k-1 個關鍵碼,關鍵碼按照遞增次序進行排列;
關鍵字數量需要滿足ceil(m/2)-1 <= n <= m-1;
插入:
如果該結點的關鍵字個數沒有到達m-1個,那么直接插入即可;
如果該結點的關鍵字個數已經到達了m-1個,那么根據B樹的性質顯然無法滿足,需要將其進行分裂。分裂的規則是該結點分成兩半,將中間的關鍵字進行提升,加入到父親結點中,但是這又可能存在父親結點也滿員的情況,則不得不向上進行回溯,甚至是要對根結點進行分裂,那么整棵樹都加了一層。
b+tree:以一個m階樹為例
根結點只有一個,分支數量范圍為[2,m];
分支結點,每個結點包含分支數范圍為[ceil(m/2), m];
分支結點的關鍵字數量等於其子分支的數量;
所有葉子結點都在同一層,其關鍵字的數量范圍為[ceil(m/2), m],從小到達進行排序;