「轉」MyISAM與InnoDB的索引差異究竟是啥尼桶?

數據結構:

(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

其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

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

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

name為KEY羊精,有一棵name的索引樹囚玫,葉子存儲id

當:

select * from t where name=‘lisi’;

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

畫外音:所以,其實掃了2遍索引樹定铜。

三怕敬,總結

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

MyISAM的索引與數據分開存儲

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

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

InnoDB的聚集索引存儲數據行本身畸陡,普通索引存儲主鍵

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末丁恭,一起剝皮案震驚了整個濱河市牲览,隨后出現的幾起案子桑驱,更是在濱河造成了極大的恐慌,老刑警劉巖痊硕,帶你破解...
    沈念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

推薦閱讀更多精彩內容