mysql官方對索引的定義為:索引(index)是幫助mysql高效獲取資料的資料結構。句子主幹就是索引是資料結構。
資料庫查詢是資料庫的主要功能,我們都希望查詢資料的速度盡可能快,因此資料庫系統設計會從查詢的優化的角度進行優化。最基本的查詢演算法就是順序查詢,但這種複雜度為o(n)查詢在資料量大的時候是糟糕的。當然還有很多好的查詢演算法,如:二分查詢(binary search)、二叉樹查詢(binary tree search)等,但這些演算法只能應用於特定的資料結構中,例如二分查詢要求資料有序,二叉樹查詢只能應用於二叉查詢樹上;而正常的資料是不能夠完全滿足資料結構,所以將這些資料結構以某種方式引用資料,這樣就可以在這些資料結構上實現高階的查詢演算法。這種資料結構就是索引。
雖然上圖展示的是乙個正確的索引,但是在實際應用中,沒有乙個資料庫是依賴二叉查詢樹或紅黑樹來作為索引的資料結構。原因在後續介紹。
b-tree
b-tree:多路查詢樹,一種適合磁碟或其他儲存裝置的資料結構
b-tree特性
(ceil(x)為去上限的函式)
1、數種每個節點最多有m個孩子;
2、除了根節點和葉子節點外,其他每個節點至少有ceil(m/2)個孩子
3、若根節點不是葉子節點,則至少有2個孩子
4、所有葉子節點都出現在同一層,葉子節點不包含任何關鍵字資訊
5、每個非終端結點中包含有n個關鍵字資訊: (n,p0,k1,p1,k2,p2,……,kn,pn)。其中:
a) ki (i=1…n)為關鍵字,且關鍵字按順序排序k(i-1)< ki。
b) pi為指向子樹根的接點,且指標p(i-1)指向子樹種所有結點的關鍵字均小於ki,但都大於k(i-1)。
c) 關鍵字的個數n必須滿足: ceil(m / 2)-1 <= n <= m-1
插入乙個元素時,首先在b-tree中是否存在,如果不存在,即在葉子結點處結束,然後在葉子結點中插入該新的元素,注意:如果葉子結點空間足夠,這裡需要向右移動該葉子結點中大於新插入關鍵字的元素,如果空間滿了以致沒有足夠的空間去新增新的元素,則將該結點進行「**」,將一半數量的關鍵字元素**到新的其相鄰右結點中,中間關鍵字元素上移到父結點中(當然,如果父結點空間滿了,也同樣需要「**」操作),而且當結點中關鍵元素向右移動了,相關的指標也需要向右移。如果在根結點插入新元素,空間滿了,則進行**操作,這樣原來的根結點中的中間關鍵字元素向上移動到新的根結點中,因此導致樹的高度增加一層。
delete
首先查詢b-tree中需刪除的元素,如果該元素在b-tree中存在,則將該元素在其結點中進行刪除,如果刪除該元素後,首先判斷該元素是否有左右孩子結點,如果有,則上移孩子結點中的某相近元素到父節點中,然後是移動之後的情況;如果沒有,直接刪除後,移動之後的情況.。
刪除元素,移動相應元素之後,如果某結點中元素數目小於ceil(m/2)-1,則需要看其某相鄰兄弟結點是否豐滿(結點中元素個數大於ceil(m/2)-1),如果豐滿,則向父節點借乙個元素來滿足條件;如果其相鄰兄弟都剛脫貧,即借了之後其結點數目小於ceil(m/2)-1,則該結點與其相鄰的某一兄弟結點進行「合併」成乙個結點,以此來滿足條件
#### b+tree
b+tree 是b-tree的增強版,它將所有的資料都儲存在了葉子節點中,非葉子節點值存放關鍵字和孩子指標,因此最大化了內部節點的分支因子,所以b+tree的遍歷更加高效
磁碟訪問原理
索引一般以檔案形式儲存在磁碟上,索引檢索需要i/o操作,而磁碟i/o存在機械運動的耗費,時間消耗是極大的。
磁碟結構
碟片被劃分成一系列同心環,圓心是碟片中心,每個同心環叫做乙個磁軌,所有半徑相同的磁軌組成乙個柱面。磁軌被沿半徑線劃分成乙個個小的段,每個段叫做乙個扇區,每個扇區是磁碟的最小儲存單元
磁碟預讀
為了提高效率,儘量減少磁碟i/o,磁碟每次會進行預讀,預讀的單位是頁(page),當程式要讀取的資料不在主存中時,會觸發乙個缺頁異常,此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。
使用b-tree/b+tree
因為磁碟預讀大單位為頁(page),所以索引中b-tree/b+tree度的設定一般為度的大小。
b-tree中一次檢索最多需要h-1次i/o,相對於紅黑樹的高度要少很多,也就更加的節省資源。
mysql 資料結構 Mysql索引資料結構
mysql索引資料結構 當慢查詢時,看sql是否走索引。索引的本質 索引是幫助mysql高效獲取資料的排好序的資料結構。mysql若不建立索引,查詢某條資料時則會逐行掃瞄,每掃瞄一行資料就會做一次磁碟io。b tree 葉節點具有相同的深度,葉節點的指標為空。所有索引元素不重複。葉節點中的資料索引從...
mysql索引資料結構 mysql索引資料結構
什麼是索引?索引就是排好序的資料結構,可以幫助我們快速的查詢到資料 幾種資料結構 二叉樹 如果資料是單邊增長的情況 那麼出現的就是和鍊錶一樣的資料結構了,樹高度大 紅黑樹 在二叉樹的基礎上多了樹平衡,也叫二叉平衡樹,不像二叉樹那樣極端的情況會往乙個方向發展。同樣我們查詢6,在二叉樹中我們需要經過6個...
MySQL索引資料結構
mysql官方對索引的定義為 索引 index 是幫助mysql高效獲取資料的資料結構。句子主幹就是索引是資料結構。資料庫查詢是資料庫的主要功能,我們都希望查詢資料的速度盡可能快,因此資料庫系統設計會從查詢的優化的角度進行優化。最基本的查詢演算法就是順序查詢,但這種複雜度為o n 查詢在資料量大的時...