mysql索引探究 btree索引和hash索引

B-tree索引
mysql中btree存儲的物理文件大多是balance tree(平衡樹)結構來存儲的。也就是實際存儲數據放在葉節(jié)點。而且任何一個葉節(jié)點的最短路徑都一樣。可能各種數據庫的在存放自己的btree索引時會對存儲結構做改動。例如:innodo的btree實際上是b+tree,在原有的葉節(jié)點除了存放索引等關鍵信息外,還存儲了后一個葉節(jié)點的指針信息。這是出于加快檢索多個相鄰的葉節(jié)點的效率考慮的。
主鍵索引 :
葉節(jié)點存放的,除了主鍵的數據外,還有其他字段數據的以主鍵的有序排列。所以,通過主鍵來訪問數據效率是非常高的。
btree索引:
不僅在葉節(jié)點存放索引的相關信息,也有主鍵值。
通過secondary index訪問,通過相應的索引檢索到leaf node,再通過leaf node中存放的主鍵信息來獲取數據行。

Image.png

MyISAM的索引形式是b+tree,leaf node存放的是數據記錄地址。可以看的出來,myisam的索引文件僅僅保存數據記錄的地址
MyISAM索引文件和數據文件是分離的
它的主索引和輔助索引在結構上沒有區(qū)別,只是主索引要求唯一,而輔助索引可以重復。
MyISAM的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與InnoDB的聚集索引區(qū)分。
MyISAM中首先按照b+tree搜索算法搜索索引,如果指定的key存在,則去除data域,再通過data域的值為地址去讀取相應的數據記錄。

Image.png

InnoDB的數據文件本身就是索引文件。
InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節(jié)點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。
這種索引叫做聚集索引。
因為InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵
所以,innodb檢索直接通過主鍵非常地高效。

與MyISAM索引的不同是InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。換句話說:innodb的輔助索引會引用主鍵作為自己的data域。
聚集索引這種實現方式使得按主鍵的搜索十分高效。

innodb的主鍵不宜過長,以為輔助索引會引用主索引。過長的主索引會導致輔助索引變大。
根據b+tree的特性,自增字段可以做到和b+tree的leaf node分裂順序一致。所以用自增字段做innodb的主鍵是一個很好的選擇

Image.png

標準的B+tree
一個平衡的多叉樹,根節(jié)點到各葉節(jié)點的高度差不超過1,同層級節(jié)點之間有指針相互銜接。
這種數據結構,從根節(jié)點到葉節(jié)點的檢索效率相當,基于索引的順序掃描,也可以利用雙向指針快速順序移動。效率很高。
所以,B+樹索引被廣泛應用于數據庫、文件系統等場景。
順便說一下,xfs文件系統比ext3/ext4效率高很多的原因之一就是,它的文件及目錄索引結構全部采用B+樹索引,而ext3/ext4的文件目錄結構則采用Linked list, hashed B-tree、Extents/Bitmap等索引數據結構,因此在高I/O壓力下,其IOPS能力不如xfs。

Image.png

哈希索引就是把鍵值通過hash算法,轉化為hash值,檢索不需要像btree那樣從根節(jié)點到葉節(jié)點這樣逐級查找。只需要一次hash算法就可定位。
Hash索引
hash索引的檢索效率高于btree,因為它是一次到位,不像btree要從根節(jié)點到枝節(jié)點,再到頁節(jié)點多次的IO訪問。
但是hash 也有很多弊端:
1.僅僅能滿足 "=","IN"和"<=>",它不能使用范圍查詢。
因為他是通過比較hash值,原先是有序的鍵值,經過hash有可能變得不連續(xù)了,so只能用于等值過濾。

2.同理,無法進行數據的排序操作,以及 like ‘xxx%’這樣的模糊查詢(模糊查詢,本質上還是范圍查詢)

3.不能利用部分索引查詢
因為它是計算組合索引合并后的hash值,而不是單獨計算。對于一個或者多個的組合索引進行查詢的時候,hash索引無法被利用。

4在任何時候都不能避免掃描全表
由于不同的hash索引存在相同的hash值,所以即使?jié)M足某個hash值的記錄條數,也無法直接在hash索引中完成查詢。還是要通過表中的數據進行實際的比較。

5.在遇到大量的重復鍵,就是hash值相等的情況下,性能不一定比btree高。
因為存在hash沖撞。

在MySQL中,只有HEAP/MEMORY引擎表才能顯式支持哈希索引(NDB也支持,但這個不常用),
InnoDB引擎的自適應哈希索引(adaptive hash index)不在此列,因為這不是創(chuàng)建索引時可指定的。
還需要注意到:HEAP/MEMORY引擎表在mysql實例重啟后,數據會丟失。

適合用hash索引
SELECT … FROM t WHERE C1 = ?; — 僅等值查詢
大多數情況下,都會有范圍查詢,模糊查詢這些,用btree索引就行。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容