MySQL索引實(shí)現(xiàn)原理 + MyISAM和InnoDB索引結(jié)構(gòu) + 聚簇索引和非聚簇索引

本文非小馬原創(chuàng),為學(xué)習(xí)總結(jié)筆記,作為日后復(fù)盤回顧邑退,感謝原作者分享竹宋,文末已注明出處,侵刪地技。

MySQL中索引實(shí)現(xiàn)的原理是什么蜈七?目前大部分?jǐn)?shù)據(jù)庫系統(tǒng)及文件系統(tǒng)都采用B-Tree(B樹)或其變種B+Tree(B+樹)作為索引結(jié)構(gòu)。B+Tree是數(shù)據(jù)庫系統(tǒng)實(shí)現(xiàn)索引的首選數(shù)據(jù)結(jié)構(gòu)莫矗。在 MySQL 中,索引屬于存儲引擎級別的概念,不同存儲引擎對索引的實(shí)現(xiàn)方式是不同的飒硅。

樹砂缩,二叉樹(從左到右垂直有序),平衡二叉樹(左右高度限制)三娩,b樹庵芭,b+樹,完全二叉樹雀监,堆(上下每一層大小是有序的双吆,左右大小無序),大根堆会前,小根堆好乐。

一、MyISAM 索引實(shí)現(xiàn)

MyISAM 引擎使用 B+Tree 作為索引結(jié)構(gòu),葉節(jié)點(diǎn)的 data 域存放的是數(shù)據(jù)記錄的地址瓦宜。我們借用兩張圖來說明蔚万。

主鍵索引
輔助索引列

MyISAM 的索引方式也叫做“非聚集索引”,之所以這么稱呼是為了與 InnoDB的聚集索引區(qū)分。意思是临庇,索引中只保存著數(shù)據(jù)在表中的地址而不是保存數(shù)據(jù)本身反璃。

二、InnoDB 索引實(shí)現(xiàn)

InnoDB 也使用 B+Tree 作為索引結(jié)構(gòu),但具體實(shí)現(xiàn)方式卻與 MyISAM 截然不同苔巨。InnoDB 的數(shù)據(jù)文件本身就是索引文件版扩。從上文知道,MyISAM 索引文件和數(shù)據(jù)文件是分離的,索引文件僅保存數(shù)據(jù)記錄的地址。而在InnoDB 中,表數(shù)據(jù)文件本身就是按 B+Tree 組織的一個索引結(jié)構(gòu),這棵樹的葉點(diǎn)data 域保存了完整的數(shù)據(jù)記錄侄泽。這個索引的 key 是數(shù)據(jù)表的主鍵,因此 InnoDB 表數(shù)據(jù)文件本身就是主索引礁芦。

借用兩張圖來說明。

主鍵索引
輔助索引列

InnoDB 主索引(同時也是數(shù)據(jù)文件),可以看到葉節(jié)點(diǎn)包含了完整的數(shù)據(jù)記錄悼尾。這種索引叫做聚集索引柿扣。

三、總結(jié)

myisam中主鍵索引和輔助索引都是記錄數(shù)據(jù)在表中的地址闺魏,索引比較小未状,但查詢數(shù)據(jù)都需要二次查找。先根據(jù)索引找到數(shù)據(jù)地址再通過地址查找到表中的數(shù)據(jù)析桥。

innodb主鍵索引是聚簇的司草,索引樹中直接記錄了表數(shù)據(jù),占空間比較大泡仗。輔助索引是非聚簇的埋虹,這和上面myisam一樣。啥意思呢娩怎?主鍵索引的查找只需要一次查找直接拿到數(shù)據(jù)搔课,非主鍵的索引查找需要二次查找。所以主鍵索引會比較快截亦。

彩蛋1:對于innodb而言爬泥,表沒有主鍵可以嗎柬讨?

可以,但是如果沒有主鍵袍啡,就是屬于輔助索引踩官,要多查一次索引。不過mysql會拿唯一鍵來自動創(chuàng)建為隱藏的主鍵索引葬馋,所以如果是對唯一鍵條件查詢卖鲤,其實(shí)沒有主鍵也不會多一次查找。因?yàn)?b>聚簇索引具有唯一性畴嘶,由于聚簇索引是將數(shù)據(jù)跟索引結(jié)構(gòu)放到一塊蛋逾,因此一個表僅有一個聚簇索引。聚簇索引默認(rèn)是主鍵窗悯,如果表中沒有定義主鍵区匣,InnoDB 會選擇一個唯一且非空的索引代替。如果沒有這樣的索引蒋院,InnoDB 會隱式定義一個主鍵(類似oracle中的RowId)來作為聚簇索引亏钩。聚簇索引是唯一的,InnoDB一定會有一個聚簇索引來保存數(shù)據(jù)欺旧。非聚簇索引一定存儲有聚簇索引的列值姑丑。

InnoDB聚簇索引選擇順序:

默認(rèn)選擇主鍵;

沒有主鍵辞友,選擇唯一的非空索引栅哀;

都沒有,則隱式定義一個主鍵称龙;

非聚簇索引留拾,數(shù)據(jù)存儲和索引分開,葉子節(jié)點(diǎn)存儲對應(yīng)的行鲫尊,需要二次查找痴柔,通常稱為[二級索引]或[輔助索引]。


彩蛋2:count函數(shù)會引起全表掃描嗎疫向?

InnoDB:count(主鍵) 全表掃描累加咳蔚,count(1)全表掃描累加,count(字段)分為字段可為空和字段不可為空搔驼,不可為空則讀到后累加谈火,可為空則讀到后判斷不為空累加。count(*) 不取值累加匙奴。除了 count(*)外其他都要取值基本上 count(*)是最快的堆巧。

MyISAM: 會記錄一張表的行數(shù)妄荔,count 時直接返回行數(shù)泼菌。

彩蛋3:我們經(jīng)常在DB工具中創(chuàng)建索引時選擇索引類型除了Btree還有個哈希類型?
是的谍肤。哈希類型的優(yōu)點(diǎn):哈希表這種結(jié)構(gòu)適用于只有等值查詢的場景,新增方便哗伯。缺點(diǎn):非有序荒揣,做區(qū)間查詢的速度是很慢,需要全部遍歷:干病系任!哈希索引也不支持多列聯(lián)合索引的最左匹配規(guī)則!虐块!

參考文獻(xiàn):

MySQL索引實(shí)現(xiàn)原理分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俩滥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贺奠,更是在濱河造成了極大的恐慌霜旧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儡率,死亡現(xiàn)場離奇詭異挂据,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)儿普,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門崎逃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人眉孩,你說我怎么就攤上這事个绍。” “怎么了勺像?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵障贸,是天一觀的道長。 經(jīng)常有香客問我吟宦,道長篮洁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任殃姓,我火速辦了婚禮袁波,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜗侈。我一直安慰自己篷牌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布踏幻。 她就那樣靜靜地躺著枷颊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夭苗,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天信卡,我揣著相機(jī)與錄音,去河邊找鬼题造。 笑死傍菇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的界赔。 我是一名探鬼主播丢习,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼淮悼!你這毒婦竟也來了咐低?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤袜腥,失蹤者是張志新(化名)和其女友劉穎渊鞋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞧挤,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锡宋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了特恬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片执俩。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖癌刽,靈堂內(nèi)的尸體忽然破棺而出役首,到底是詐尸還是另有隱情,我是刑警寧澤显拜,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布衡奥,位于F島的核電站,受9級特大地震影響远荠,放射性物質(zhì)發(fā)生泄漏矮固。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一譬淳、第九天 我趴在偏房一處隱蔽的房頂上張望档址。 院中可真熱鬧,春花似錦邻梆、人聲如沸守伸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尼摹。三九已至见芹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蠢涝,已是汗流浹背辆童。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惠赫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓故黑,卻偏偏與公主長得像儿咱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子场晶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345