《MySQL面試小抄》索引考點(diǎn)一面總結(jié)

我是肥哥蹬昌,一名不專業(yè)的面試官!

我是囧囧攀隔,一名積極找工作的小菜鳥皂贩,囧囧表示:面試最怕的就是面試官問的知識(shí)點(diǎn)太籠統(tǒng),自己無法快速定位到關(guān)鍵問題點(diǎn)@バ凇C魉ⅰ!


本期主要面試考點(diǎn)

面試官考點(diǎn)之談?wù)勀銓?duì)索引的理解满粗?
面試官考點(diǎn)之解釋一下計(jì)算機(jī)層面索引快的原因辈末?
面試官考點(diǎn)之為什么不使用哈希結(jié)構(gòu)作為索引結(jié)構(gòu)?
面試官考點(diǎn)之為什么不使用二叉樹作為索引結(jié)構(gòu)?
面試官考點(diǎn)之為什么不使用B-Tree挤聘,而是B+Tree轰枝?
面試官考點(diǎn)之索引是加速查詢,那么是否應(yīng)該給表盡可能建立多的索引列组去?

索引小抄

面試官考點(diǎn)之談?wù)勀銓?duì)索引的理解鞍陨?

談到索引,最先聯(lián)想到的大概就是字典目錄从隆,根據(jù)MySQL官方定義诚撵,索引是用來幫助MySQL高效獲取數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu)。

本質(zhì)上:索引是一種有序的快速查找的數(shù)據(jù)結(jié)構(gòu)键闺,用來快速高效的查找數(shù)據(jù)寿烟。

簡(jiǎn)單來說,可以類比字典目錄辛燥,火車車次表筛武。

面試官考點(diǎn)之解釋一下計(jì)算機(jī)層面索引快的原因?

計(jì)算機(jī)從磁盤獲取數(shù)據(jù)购桑,加載到內(nèi)存期間,一般都要經(jīng)歷3個(gè)常規(guī)的耗時(shí)過程

1氏淑、尋道(時(shí)間):確定要讀的數(shù)據(jù)在哪個(gè)磁道耗費(fèi)的時(shí)間
2勃蜘、旋轉(zhuǎn)延遲(時(shí)間):確定要讀的數(shù)據(jù)在磁道上的哪個(gè)扇區(qū)耗費(fèi)的時(shí)間
3、數(shù)據(jù)傳輸(時(shí)間):數(shù)據(jù)加載到內(nèi)存耗費(fèi)的時(shí)間

每次加載數(shù)據(jù)假残,我們稱其為一次磁盤IO缭贡,每一次IO操作耗費(fèi)時(shí)間 = 尋道 + 旋轉(zhuǎn)延遲 + 數(shù)據(jù)傳輸(時(shí)間短暫,可以忽略不計(jì))辉懒。

事實(shí)上實(shí)際加載數(shù)據(jù)到內(nèi)存的時(shí)間非常短暫阳惹,一次IO操作主要的耗時(shí)來自尋道和旋轉(zhuǎn)延遲。

總體來說眶俩,一般一次IO操作莹汤,耗時(shí)大概只有幾ms。假如是4ms颠印,雖然看起來很短暫纲岭,但是數(shù)據(jù)庫百萬級(jí)別的數(shù)據(jù)加載一遍,就需要4000s线罕,對(duì)于一個(gè)系統(tǒng)來說止潮,簡(jiǎn)直是毀滅級(jí)別的。

我們需要的就是減少磁盤IO的次數(shù)钞楼,這也是使用索引的意義所在@ⅰ!!索引能夠保證在億級(jí)別的數(shù)據(jù)燃乍,只需要2~4次磁盤IO唆樊,這無疑是個(gè)福音!

面試官考點(diǎn)之為什么不使用哈希結(jié)構(gòu)作為索引結(jié)構(gòu)橘沥?

一般正常的業(yè)務(wù)場(chǎng)景中窗轩,通常查詢多數(shù)是范圍查詢 類似:

select id, name, age from sys_user where age between 18 and 28;

哈希結(jié)構(gòu)作為索引,那么存儲(chǔ)引擎就會(huì)為每一行表記錄計(jì)算出哈希值座咆,哈希索引存儲(chǔ)的就是HASH碼痢艺;

HASH碼直接隨機(jī)生成,并沒有規(guī)律

沒有規(guī)律的HASH碼介陶,導(dǎo)致數(shù)據(jù)隨機(jī)分布存儲(chǔ)堤舒,這就導(dǎo)致即使是兩個(gè)很相近的行記錄,極大可能也會(huì)被分配到不同的桶(磁盤塊)中哺呜。

最壞的情況下每查找一條記錄舌缤,都要進(jìn)行一次磁盤IO (可怕)。

優(yōu)點(diǎn)某残,哈希結(jié)構(gòu)這樣key-val 鍵值對(duì)的形式對(duì)于精確查找非常敏感国撵,對(duì)全值匹配很友好,所以單條記錄查詢效率非常高玻墅,時(shí)間復(fù)雜度為 1介牙,但是我們?nèi)粘I(yè)務(wù)來說,最常用的還是范圍搜索澳厢,所以不哈希結(jié)構(gòu)適合环础。

記住一點(diǎn)即可:Hash索引適合精確查找,全值匹配剩拢,不適合范圍查找线得。

MySQL目前有Memory引擎和NDB引擎支持Hash索引。

面試官考點(diǎn)之為什么不使用二叉樹作為索引結(jié)構(gòu)徐伐?

首先觀察一下二叉樹結(jié)構(gòu)

二叉樹

二叉樹最多有兩個(gè)子節(jié)點(diǎn)贯钩,這種結(jié)構(gòu)導(dǎo)致樹的高度會(huì)很高,增加IO次數(shù)办素,特殊情況下可能化為鏈表結(jié)構(gòu)魏保,相當(dāng)于全表掃描,全量磁盤IO摸屠。

假設(shè)二叉樹結(jié)構(gòu)作為索引谓罗,理想情況下是一顆完全二叉樹,那么具有n個(gè)節(jié)點(diǎn)的完全二叉樹深度為log2x+1

(其中x表示不大于n的最大整數(shù))

如果一個(gè)數(shù)據(jù)在二叉樹結(jié)構(gòu)的100層季二,那么為了查找到此數(shù)據(jù)檩咱,需要進(jìn)行100次磁盤IO揭措。更糟糕情況下,二叉樹會(huì)退化成鏈表結(jié)構(gòu)刻蚯,既绊含,斜二叉樹。

斜二叉樹

類似的平衡二叉樹炊汹,高度也很高躬充。

面試官考點(diǎn)之為什么不使用B-Tree,而是B+Tree讨便?

既然二叉樹結(jié)構(gòu)樹高度很高充甚,導(dǎo)致查詢時(shí)磁盤IO增加,那B-Tree 呢霸褒?B-Tree可以存儲(chǔ)更多的數(shù)據(jù)伴找,高度更低,為什么不選擇废菱?而是B+Tree技矮?

B-Tree是多路平衡搜索樹,相比二叉樹結(jié)構(gòu)殊轴,可以極大的優(yōu)化磁盤IO次數(shù)衰倦,但是B-Tree每個(gè)節(jié)點(diǎn)中不僅包含數(shù)據(jù)的key(索引值),還有data(整行記錄)旁理,使用B-Tree結(jié)構(gòu)樊零,優(yōu)點(diǎn)是找到索引就代表找到了數(shù)據(jù)記錄。

既然如此為什么不使用B-Tree結(jié)構(gòu)韧拒?還是老問題淹接,磁盤IO數(shù)J浴E岩纭!

我們知道MySQL讀取數(shù)據(jù)是以頁為單位(磁盤塊)劲适,每頁(或者說每個(gè)磁盤塊)的存儲(chǔ)空間是有限的

如果data 很大楷掉,將會(huì)導(dǎo)致每頁存儲(chǔ)的索引數(shù)量很小

所以數(shù)據(jù)表存儲(chǔ)的數(shù)據(jù)量很大的時(shí)候同樣會(huì)導(dǎo)致 B-Tree的深度很大,增大查詢時(shí)的磁盤I/O次數(shù)霞势,進(jìn)而影響查詢效率烹植。

再說到B+Tree,B+Tree是對(duì)B-Tree 的一種優(yōu)化結(jié)構(gòu)愕贡,使其更適合實(shí)現(xiàn)外存儲(chǔ)索引結(jié)構(gòu)

1草雕、非葉子節(jié)點(diǎn)只存儲(chǔ)鍵值信息(索引信息)

2、所有的數(shù)據(jù)記錄都按照鍵值大小順序存放在同一層的葉子節(jié)點(diǎn)上

好處:B+Tree的非葉子節(jié)點(diǎn)只存儲(chǔ)鍵值信息固以,那么每一頁能存儲(chǔ)更多的索引墩虹,樹的高度被壓縮到很低嘱巾,磁盤IO次數(shù)更小,一般情況下2~4次IO诫钓,即可查詢到想要的記錄旬昭。

而且因?yàn)楸頂?shù)據(jù)都是順序存儲(chǔ)在B+Tree結(jié)構(gòu)的葉子節(jié)點(diǎn),所以對(duì)于范圍查找很友好菌湃,效率高问拘!

面試官考點(diǎn)之索引是加速查詢,那么是否應(yīng)該給表盡可能建立多的索引列惧所?

雖然索引的優(yōu)勢(shì)是加快查詢效率骤坐,減少磁盤IO次數(shù),但是盲目創(chuàng)建過多索引纯路,大大增加了維護(hù)索引的時(shí)間成本和空間成本或油。

首先說一下索引的好處

1、減少IO次數(shù)驰唬,提高-檢索效率

2顶岸、降低數(shù)據(jù)排序成本,可以減少CPU消耗

時(shí)間成本

因?yàn)樗饕怯行虻目焖俨檎医Y(jié)構(gòu)叫编,要維護(hù)索引的這個(gè)快速查找且有序特性辖佣,需要不斷的進(jìn)行調(diào)整,而調(diào)整就需要時(shí)間成本搓逾。

創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間卷谈,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候霞篡,索引也要?jiǎng)討B(tài)地維護(hù)世蔗,這樣就降低了數(shù)據(jù)的維護(hù)速度。

而且這種時(shí)間成本隨著數(shù)據(jù)量的增加而增加朗兵!

空間成本

其次污淋,每一個(gè)索引都是一棵B+Tree,保存索引和指向?qū)嶓w表的引用余掖,需要占據(jù)空間寸爆。

如果建立的是聚簇索引,數(shù)據(jù)和主鍵都保存在索引文件中盐欺,則需要更大的空間成本赁豆。

敬請(qǐng)期待囧囧小白索引二面內(nèi)容!

更多精彩內(nèi)容冗美,歡迎關(guān)注微信公眾號(hào):囧么肥事 (或搜索:jiongmefeishi)

閱讀原文:《MySQL面試小抄》索引考點(diǎn)一面總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魔种,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粉洼,更是在濱河造成了極大的恐慌节预,老刑警劉巖甲抖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異心铃,居然都是意外死亡准谚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門去扣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柱衔,“玉大人,你說我怎么就攤上這事愉棱∷纛恚” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵奔滑,是天一觀的道長(zhǎng)艾岂。 經(jīng)常有香客問我,道長(zhǎng)朋其,這世上最難降的妖魔是什么王浴? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮梅猿,結(jié)果婚禮上氓辣,老公的妹妹穿的比我還像新娘。我一直安慰自己袱蚓,他們只是感情好钞啸,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喇潘,像睡著了一般体斩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颖低,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天絮吵,我揣著相機(jī)與錄音,去河邊找鬼枫甲。 笑死源武,一個(gè)胖子當(dāng)著我的面吹牛扼褪,可吹牛的內(nèi)容都是我干的想幻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼话浇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼脏毯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幔崖,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤食店,失蹤者是張志新(化名)和其女友劉穎渣淤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吉嫩,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡价认,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了自娩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片用踩。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忙迁,靈堂內(nèi)的尸體忽然破棺而出脐彩,到底是詐尸還是另有隱情,我是刑警寧澤姊扔,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布惠奸,位于F島的核電站,受9級(jí)特大地震影響恰梢,放射性物質(zhì)發(fā)生泄漏佛南。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一嵌言、第九天 我趴在偏房一處隱蔽的房頂上張望共虑。 院中可真熱鬧,春花似錦呀页、人聲如沸妈拌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尘分。三九已至,卻和暖如春丸氛,著一層夾襖步出監(jiān)牢的瞬間诬滩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工衅码, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粥脚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓禾锤,卻偏偏與公主長(zhǎng)得像私股,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恩掷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359