MySql性能調(diào)優(yōu)二(BTree甲献、B+Tree與索引數(shù)據(jù)結(jié)構(gòu))

前言

本篇基于上一篇MySql性能調(diào)優(yōu)一(存儲(chǔ)引擎InnoDB,MyISAM)颂翼,本篇繼續(xù)學(xué)習(xí)Mysql性能調(diào)優(yōu)晃洒,關(guān)于BTree、B+Tree與mysql索引數(shù)據(jù)結(jié)構(gòu)理解朦乏。

BTree特性

BTree又叫多路平衡查找樹球及,一顆m叉的BTree特性如下:

  • 樹中每個(gè)節(jié)點(diǎn)最多包含m個(gè)孩子。
  • 除根節(jié)點(diǎn)與葉子節(jié)點(diǎn)外呻疹,每個(gè)節(jié)點(diǎn)至少有[ceil(m/2)]個(gè)孩子吃引。
  • 若根節(jié)點(diǎn)不是葉子節(jié)點(diǎn),則至少有兩個(gè)孩子刽锤。
  • 所有的葉子節(jié)點(diǎn)都在同一層镊尺。
  • 每個(gè)非葉子節(jié)點(diǎn)由n個(gè)key與n+1個(gè)指針組成,其中[ceil(m/2)-1] <= n <= m-1 并思。
BTree.png

BTree插入

以5叉BTree為例庐氮,key的數(shù)量:公式推導(dǎo)[ceil(m/2)-1] <= n <= m-1。所以 2 <= n <=4宋彼。當(dāng)n>4時(shí)弄砍,中間節(jié)點(diǎn)分裂到父節(jié)點(diǎn),兩邊節(jié)點(diǎn)分裂输涕。

  1. 以插入C N G A H E K Q M F W L T Z D P R X Y S為例音婶,前4個(gè)字母沒什么好說的。
1.png
  1. 插入H莱坎,n>4衣式,中間元素G字母向上分裂到新的節(jié)點(diǎn)。
2.png
  1. 插入E型奥,K瞳收,Q不需要分裂。
3.png
  1. 插入M厢汹,中間元素M字母向上分裂到父節(jié)點(diǎn)G。
4.png
  1. 插入F谐宙,W烫葬,L,T不需要分裂。
5.png
  1. 插入Z搭综,中間元素T向上分裂到父節(jié)點(diǎn)中垢箕。
6.png
  1. 插入D,中間元素D向上分裂到父節(jié)點(diǎn)中兑巾。然后插入P条获,R,X蒋歌,Y不需要分裂帅掘。
7.png
  1. 最后插入S,NPQR節(jié)點(diǎn)n>5堂油,中間節(jié)點(diǎn)Q向上分裂修档,但分裂后父節(jié)點(diǎn)DGMT的n>5,中間節(jié)點(diǎn)M向上分裂府框。需要注意的是吱窝,原BTree第三個(gè)子節(jié)點(diǎn)HKL會(huì)包含DG節(jié)點(diǎn)中。
8.png

到此迫靖,一個(gè)BTree的構(gòu)建就完成了院峡,怎么樣?是不是很簡(jiǎn)單系宜。刪除操作比插入略微復(fù)雜照激,鑒于篇幅,不做敘述蜈首。

B+Tree

B+Tree為BTree的變種实抡,B+Tree與BTree的區(qū)別為:

  • 有n棵子樹的B+Tree最多含有n個(gè)key,而BTree最多含有n-1個(gè)key欢策。
  • B+Tree的葉節(jié)點(diǎn)保存所有的key信息吆寨,依key大小順序排列。
  • 所有的非葉子節(jié)點(diǎn)都可以看作是key的索引部分踩寇,節(jié)點(diǎn)中只含有其子節(jié)點(diǎn)的最大(或最凶那濉)key。
B+Tree.png

由于B+Tree只有葉子節(jié)點(diǎn)保存key信息俺孙,查詢?nèi)魏蝛ey都要從root走到葉子辣卒。所以B+Tree的查詢效率更加穩(wěn)定。

帶有順序指針的B+Tree

MySql索引數(shù)據(jù)結(jié)構(gòu)對(duì)經(jīng)典的B+Tree進(jìn)行了優(yōu)化睛榄。

帶有順序指針的B+Tree.png

在原B+Tree的基礎(chǔ)上荣茫,增加一個(gè)指向相鄰葉子節(jié)點(diǎn)的指針,就形成了帶有順序指針的B+Tree场靴,提高區(qū)間訪問的性能啡莉。
如上圖訪問18-49的元素港准,只需要順著18的指針走向49即可。

MySql索引數(shù)據(jù)結(jié)構(gòu)

在mysql中咧欣,索引的實(shí)現(xiàn)方式與存儲(chǔ)引擎相關(guān)浅缸,MySql支持多種索引類型,如B+Tree魄咕、Hash索引衩椒、全文索引等等。在此只關(guān)注MyISAM與InnoDB的B+Tree索引數(shù)據(jù)結(jié)構(gòu)哮兰。

MyISAM的B+Tree索引

MyISAM的主鍵索引與輔助索引在結(jié)構(gòu)上沒有任何區(qū)別毛萌,只是主鍵索引要求key唯一〉斓牛可以看出朝聋,MyISAM的索引葉節(jié)點(diǎn)保存的是表的行的物理地址值。
MyISAM的索引是“非聚集”的囤躁,這么稱呼只是為了與InnoDB的聚集索引相區(qū)分冀痕。

MyISAM的B+Tree主鍵索引.png
InnoDB的B+Tree索引

InnoDB的索引實(shí)現(xiàn)方式與MyISAM截然不同,InnoDB的B+Tree葉子節(jié)點(diǎn)保存有完整的記錄信息狸演。這也解釋了上篇所說的InnoDB的索引與數(shù)據(jù)文件是同一個(gè)文件言蛇。

圖1.png

圖1是B+tree的主鍵索引,這種索引也叫做聚集索引宵距。InnoDB索引必須按照主鍵聚集腊尚,所有InnoDB必須要包含有主鍵。如果沒有顯示指定满哪,MySql會(huì)自動(dòng)選擇一個(gè)唯一標(biāo)識(shí)列或生成一個(gè)隱含字段作為主鍵婿斥。

圖2.png

圖2是InnoDB的B+Tree輔助索引,B+Tree的葉子節(jié)點(diǎn)只保存主鍵的值而不是行的地址值哨鸭。所以輔助索引的檢索需要檢索兩遍索引民宿。

因此,對(duì)于InnoDB的B+Tree索引使用有兩個(gè)注意點(diǎn):

  • 建議使用主鍵自增像鸡。由于B+Tree的特性活鹰,非自增的主鍵在插入時(shí)會(huì)造成B+Tree頻繁的分裂。
  • 不建議主鍵字段過長(zhǎng)只估。由于所有的輔助索引都會(huì)檢索主鍵索引志群,過長(zhǎng)的主鍵索引會(huì)使輔助索引過大。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛔钙,一起剝皮案震驚了整個(gè)濱河市锌云,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吁脱,老刑警劉巖宾抓,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件子漩,死亡現(xiàn)場(chǎng)離奇詭異豫喧,居然都是意外死亡石洗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門紧显,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讲衫,“玉大人,你說我怎么就攤上這事孵班∩媸蓿” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵篙程,是天一觀的道長(zhǎng)枷畏。 經(jīng)常有香客問我,道長(zhǎng)虱饿,這世上最難降的妖魔是什么拥诡? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮氮发,結(jié)果婚禮上渴肉,老公的妹妹穿的比我還像新娘。我一直安慰自己爽冕,他們只是感情好仇祭,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颈畸,像睡著了一般乌奇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眯娱,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天礁苗,我揣著相機(jī)與錄音,去河邊找鬼困乒。 笑死寂屏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娜搂。 我是一名探鬼主播迁霎,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼百宇!你這毒婦竟也來了考廉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤携御,失蹤者是張志新(化名)和其女友劉穎昌粤,沒想到半個(gè)月后既绕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涮坐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年凄贩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袱讹。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疲扎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捷雕,到底是詐尸還是另有隱情椒丧,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布救巷,位于F島的核電站壶熏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浦译。R本人自食惡果不足惜棒假,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望管怠。 院中可真熱鬧淆衷,春花似錦、人聲如沸渤弛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽她肯。三九已至佳头,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晴氨,已是汗流浹背康嘉。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留籽前,地道東北人亭珍。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像枝哄,于是被迫代替她去往敵國(guó)和親肄梨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容