1.聚集索引和輔助索引
在資料庫中,B+樹的高度一般都在24層,這也就是說查找某一個鍵值的行記錄時最多只需要2到4次IO,這倒不錯,因為當前一般的機械硬碟每秒至少可以做100次IO,24次的IO意味著查詢時間只需要0.02~0.04秒,
資料庫中的B+樹索引可以分為聚集索引(clustered index)和輔助索引(secondary index),
聚集索引與輔助索引相同的是:不管是聚集索引還是輔助索引,其內部都是B+樹的形式,即高度是平衡的,葉子結點存放著所有的資料,
聚集索引與輔助索引不同的是:葉子結點存放的是否是一整行的資訊
2.聚集索引
InnoDB存盤引擎表是索引組織表,即表中資料按照主鍵順序存放, 而聚集索引(clustered index)就是按照每張表的主鍵構造一棵B+樹,同時葉子結點存放的即為整張表的行記錄資料,也將聚集索引的葉子結點稱為資料頁, 聚集索引的這個特性決定了索引組織表中資料也是索引的一部分,同B+樹資料結構一樣,每個資料頁都通過一個雙向鏈表來進行鏈接,
如果未定義主鍵,MySQL取第一個唯一索引(unique)而且只含非空列(NOT NULL)作為主鍵,InnoDB使用它作為聚簇索引,
如果沒有這樣的列,InnoDB就自己產生一個這樣的ID值,它有六個位元組,而且是隱藏的,使其作為聚簇索引,
由于實際的資料頁只能按照一棵B+樹進行排序,因此每張表只能擁有一個聚集索引, 在多數情況下,查詢優化器傾向于采用聚集索引,因為聚集索引能夠在B+樹索引的葉子節點上直接找到資料, 此外由于定義了資料的邏輯順序,聚集索引能夠特別快地訪問針對范圍值得查詢,
聚集索引的好處之一:它對主鍵的排序查找和范圍查找速度非常快,葉子節點的資料就是用戶所要查詢的資料,如用戶需要查找一張表,查詢最后的10位用戶資訊,由于B+樹索引是雙向鏈表,所以用戶可以快速找到最后一個資料頁,并取出10條記錄
聚集索引的好處之二:范圍查詢(range query),即如果要查找主鍵某一范圍內的資料,通過葉子節點的上層中間節點就可以得到頁的范圍,之后直接讀取資料頁即可,
3.輔助索引
表中除了聚集索引外其他索引都是輔助索引(Secondary Index,也稱為非聚集索引),與聚集索引的區別是:輔助索引的葉子節點不包含行記錄的全部資料,
葉子節點除了包含鍵值以外,每個葉子節點中的索引行中還包含一個書簽(bookmark),該書簽用來告訴InnoDB存盤引擎去哪里可以找到與索引相對應的行資料,
由于InnoDB存盤引擎是索引組織表,因此InnoDB存盤引擎的輔助索引的書簽就是相應行資料的聚集索引鍵,
輔助索引的存在并不影響資料在聚集索引中的組織,因此每張表上可以有多個輔助索引,但只能有一個聚集索引,
當通過輔助索引來尋找資料時,InnoDB存盤引擎會遍歷輔助索引并通過葉子級別的指標獲得指向主鍵索引的主鍵,然后再通過主鍵索引來找到一個完整的行記錄,
舉例來說,如果在一棵高度為3的輔助索引樹種查找資料,那需要對這個輔助索引樹遍歷3次找到指定主鍵,如果聚集索引樹的高度同樣為3,那么還需要對聚集索引樹進行3次查找,最終找到一個完整的行資料所在的頁,因此一共需要6次邏輯IO訪問才能得到最終的一個資料頁,
4.聚集索引和非聚集索引的區別
4.1聚集索引
a)紀錄的索引順序與無力順序相同 因此更適合between and和order by操作
b)葉子結點直接對應資料 從中間級的索引頁的索引行直接對應資料頁
c)每張表只能創建一個聚集索引
4.2非聚集索引
a)索引順序和物理順序無關
b)葉子結點不直接指向資料頁
c)每張表可以有多個非聚集索引,需要更多磁盤和內容
d)多個索引會影響insert和update的速度
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/54220.html
標籤:MySQL
上一篇:MySQL安裝包安裝
