一、B+TREE
B+Tree是一種樹數據結構,是B-Tree的變種,屬于n叉排序樹,每個節點通常有多個孩子。
B+Tree是和B-Tree相比,B+Tree的所有的數據都會出現在葉子節點上,并且葉子節點會形成一個單向鏈表,非葉子節點僅僅起到索引數據作用,具體的數據都是在葉子節點存放的。
在MySQL的索引中,對原本的B+Tree進行了優化,MySQL給每個葉子節點加了一個指針,這個指針會指向它的下一個鄰居葉子節點。然后,所有的葉子節點就通過這些指針連成了一個大圈圈,變成一個雙向的循環鏈表。當我們想要查找某個范圍內的數據時,可以順著這個“鏈表”快速地找到所有相關的數據,這就而不需要再從根節點開始重新查找。而且,如果我們想要對數據進行排序,也可以利用這個“鏈表”,因為它已經是按照某種順序排列好的了。
相對Hash索引,B+tree支持范圍匹配及排序操作。
二、HASH
HASH采用鍵值對的方式,哈希(hash)比樹(B-Tree)更快,原因就是Hash索引的工作方式其實就像我們生活中的電話本或者地址簿。想象一下,你有一本電話本,里面記錄了每個人的聯系方式。為了快速找到某個人的聯系方式,電話本不是按照人名首字母或者姓氏筆畫排序,而是用了一種特別的方法給每個人編了一個號碼(這就是哈希值)。
現在,你想找某個朋友的聯系方式,你只需要查看電話本前面的索引(哈希函數),找到這個朋友對應的號碼(哈希值)。然后,你直接翻到電話本中對應號碼的位置,就能迅速找到這個朋友的聯系方式(數據)。
所以,Hash索引就是利用一個特殊的編號方法(哈希函數),給每條數據編一個獨特的號碼(哈希值)。這樣,當你需要找某條數據時,只需要用這個號碼(哈希值)就能在固定的位置(固定大小的數組)快速找到它,而不需要一頁一頁地翻找。這種方法非常快捷,但缺點是,如果兩個人的號碼(哈希值)相同,你就需要再仔細看一下,確保找到的是你要找的那個人(解決哈希沖突)。
對比B+TREE,Hash索引只能用于對等比較(=,in),不支持范圍查詢(between,>,< ,...),不支持排序操作,在一般情況下查詢效率高。