【轉】1分鐘了解MyISAM與InnoDB的索引差異

作者: 58沈劍 [架構師之路]
數據庫索引阐斜,到底是什么做的箱蝠?》介紹了B+樹掰担,它是一種非常適合用來做數據庫索引的數據結構:

(1)很適合磁盤存儲汇陆,能夠充分利用局部性原理,磁盤預讀带饱;

(2)很低的樹高度毡代,能夠存儲大量數據;

(3)索引本身占用的內存很芯琅凇月趟;

(4)能夠很好的支持單點查詢,范圍查詢恢口,有序性查詢孝宗;

數據庫的索引分為主鍵索引(Primary Inkex)與普通索引(Secondary Index)。InnoDB和MyISAM是怎么利用B+樹來實現這兩類索引耕肩,其又有什么差異呢因妇?這是今天要聊的內容问潭。

一,MyISAM的索引

MyISAM的索引與行記錄是分開存儲的婚被,叫做非聚集索引(UnClustered Index)狡忙。

其主鍵索引與普通索引沒有本質差異:

  • 有連續(xù)聚集的區(qū)域單獨存儲行記錄

  • 主鍵索引的葉子節(jié)點,存儲主鍵址芯,與對應行記錄的指針

  • 普通索引的葉子結點灾茁,存儲索引列,與對應行記錄的指針

畫外音:MyISAM的表可以沒有主鍵谷炸。

主鍵索引與普通索引是兩棵獨立的索引B+樹北专,通過索引列查找時,先定位到B+樹的葉子節(jié)點旬陡,再通過指針定位到行記錄拓颓。

舉個例子,MyISAM:

t(id PK, name KEY, sex, flag);

表中有四條記錄:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B

image

其B+樹索引構造如上圖:

  • 行記錄單獨存儲

  • id為PK描孟,有一棵id的索引樹驶睦,葉子指向行記錄

  • name為KEY,有一棵name的索引樹匿醒,葉子也指向行記錄

二场航、InnoDB的索引

InnoDB的主鍵索引與行記錄是存儲在一起的,故叫做聚集索引(Clustered Index):

  • 沒有單獨區(qū)域存儲行記錄

  • 主鍵索引的葉子節(jié)點廉羔,存儲主鍵旗闽,與對應行記錄(而不是指針)

畫外音:因此,InnoDB的PK查詢是非趁哿恚快的。

因為這個特性嫡意,InnoDB的表必須要有聚集索引:

(1)如果表定義了PK举瑰,則PK就是聚集索引;

(2)如果表沒有定義PK蔬螟,則第一個非空unique列是聚集索引此迅;

(3)否則,InnoDB會創(chuàng)建一個隱藏的row-id作為聚集索引旧巾;

聚集索引耸序,也只能夠有一個,因為數據行在物理磁盤上只能有一份聚集存儲鲁猩。

InnoDB的普通索引可以有多個坎怪,它與聚集索引是不同的:

  • 普通索引的葉子節(jié)點,存儲主鍵(也不是指針)

對于InnoDB表廓握,這里的啟示是:

(1)不建議使用較長的列做主鍵搅窿,例如char(64)嘁酿,因為所有的普通索引都會存儲主鍵,會導致普通索引過于龐大男应;

(2)建議使用趨勢遞增的key做主鍵闹司,由于數據行與索引一體,這樣不至于插入記錄時沐飘,有大量索引分裂游桩,行記錄移動;

仍是上面的例子耐朴,只是存儲引擎換成InnoDB:

t(id PK, name KEY, sex, flag);

表中還是四條記錄:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B

image

其B+樹索引構造如上圖:

  • id為PK借卧,行記錄和id索引樹存儲在一起

  • name為KEY,有一棵name的索引樹隔箍,葉子存儲id

當:

select * from t where name=‘lisi’;

image

會先通過name輔助索引定位到B+樹的葉子節(jié)點得到id=5谓娃,再通過聚集索引定位到行記錄。

畫外音:所以蜒滩,其實掃了2遍索引樹滨达。

三,總結

MyISAM和InnoDB都使用B+樹來實現索引:

  • MyISAM的索引與數據分開存儲

  • MyISAM的索引葉子存儲指針俯艰,主鍵索引與普通索引無太大區(qū)別

  • InnoDB的聚集索引和數據行統(tǒng)一存儲

  • InnoDB的聚集索引存儲數據行本身捡遍,普通索引存儲主鍵

  • InnoDB一定有且只有一個聚集索引

  • InnoDB建議使用趨勢遞增整數作為PK,而不宜使用較長的列作為PK

image

架構師之路-分享可落地的架構文章
相關推薦:

數據庫索引竹握,到底是什么做的画株?》強烈推薦

InnoDB-記錄鎖,間隙鎖啦辐,臨鍵鎖

InnoDB為什么并發(fā)高谓传,讀取快?

帶團隊,強勢真是好事么?

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末轮纫,一起剝皮案震驚了整個濱河市脉执,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異直颅,居然都是意外死亡,警方通過查閱死者的電腦和手機怀樟,發(fā)現死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門功偿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漂佩,你說我怎么就攤上這事脖含∽锼” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵养葵,是天一觀的道長征堪。 經常有香客問我,道長关拒,這世上最難降的妖魔是什么佃蚜? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮着绊,結果婚禮上谐算,老公的妹妹穿的比我還像新娘。我一直安慰自己归露,他們只是感情好洲脂,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剧包,像睡著了一般恐锦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疆液,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天一铅,我揣著相機與錄音,去河邊找鬼堕油。 笑死潘飘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的掉缺。 我是一名探鬼主播卜录,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼眶明!你這毒婦竟也來了暴凑?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赘来,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凯傲,有當地人在樹林里發(fā)現了一具尸體犬辰,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年冰单,在試婚紗的時候發(fā)現自己被綠了幌缝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡诫欠,死狀恐怖涵卵,靈堂內的尸體忽然破棺而出浴栽,到底是詐尸還是另有隱情,我是刑警寧澤轿偎,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布典鸡,位于F島的核電站,受9級特大地震影響坏晦,放射性物質發(fā)生泄漏萝玷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一昆婿、第九天 我趴在偏房一處隱蔽的房頂上張望球碉。 院中可真熱鬧,春花似錦仓蛆、人聲如沸睁冬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豆拨。三九已至,卻和暖如春狼荞,著一層夾襖步出監(jiān)牢的瞬間辽装,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工相味, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拾积,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓丰涉,卻偏偏與公主長得像拓巧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子一死,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容