索引的數(shù)據(jù)結(jié)構(gòu)和具體存儲(chǔ)引擎的實(shí)現(xiàn)有關(guān)渤刃,mysql中使用較多的索引有hash索引拥峦,B+樹(shù)索引,innodb的索引實(shí)現(xiàn)為B+樹(shù)卖子,memory存儲(chǔ)引擎為hash索引略号。
B+樹(shù)是一個(gè)平衡的多叉樹(shù),從根節(jié)點(diǎn)到每個(gè)葉子節(jié)點(diǎn)的高度差值不超過(guò)1洋闽,而且同層級(jí)的二節(jié)點(diǎn)間有指針相關(guān)連接玄柠,在B+樹(shù)上的常規(guī)檢索,從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的搜索效率基本相當(dāng)诫舅,不會(huì)出現(xiàn)大幅波動(dòng)羽利,而且基于索引的順序掃描時(shí),也可以利用雙向指針快速左右移動(dòng)刊懈,效率非常高这弧。因?yàn)椋珺+樹(shù)索引被廣泛應(yīng)用于數(shù)據(jù)庫(kù)俏讹、文件系統(tǒng)等場(chǎng)景。
哈希索引就是采用一定的哈希算法畜吊,把鍵值換算成新的哈希值泽疆,檢索時(shí)不需要類似B+樹(shù)那樣從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)逐級(jí)查找,只需一次哈希算法即可立刻定位到相應(yīng)的位置玲献,速度非逞程郏快。
如果是等值查詢捌年,那么哈希索引明顯有絕對(duì)優(yōu)勢(shì)瓢娜,因?yàn)橹恍枰?jīng)過(guò)一次算法即可找到相應(yīng)的鍵值,前提是鍵值都是唯一的礼预。如果鍵值不是唯一的眠砾,就需要先找到該鍵所在位置,然后再根據(jù)鏈表往后掃描托酸,知道找到對(duì)應(yīng)的數(shù)據(jù)
如果是范圍查詢檢索褒颈,這時(shí)候哈徐索引就毫無(wú)用武之地了柒巫,因?yàn)樵仁怯行虻逆I值,經(jīng)過(guò)哈希算法后谷丸,有可能變成不連續(xù)的了堡掏,就沒(méi)辦法再利用索引完成范圍查詢檢索
哈希所有也沒(méi)辦法利用索引完成排序,以及l(fā)ike這樣的部分模糊查詢
哈希索引也不支持多列聯(lián)合索引的最左匹配規(guī)則
B+樹(shù)索引的關(guān)鍵字檢索效率比較平均刨疼,不像B樹(shù)那樣波動(dòng)大泉唁,在有大量重復(fù)鍵值情況下,哈希索引的效率也是極低的揩慕,因此存在哈希碰撞問(wèn)題亭畜。