MySQL索引底層

1.分析B樹

相關(guān)概念

度數(shù):在樹中,每個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)(子樹)的個(gè)數(shù)就稱為該節(jié)點(diǎn)的度(degree)。
階數(shù):(Order)階定義為一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)數(shù)目的最大值。(自帶最大值屬性)

B-Tree

image.png

B+Tree

image.png

B+Tree與B-Tree區(qū)別

葉子節(jié)點(diǎn)之間都有一個(gè)鏈指針,不需要遍歷整棵樹就可以得到所存儲(chǔ)的全部數(shù)據(jù),在進(jìn)行范圍查找的時(shí)候非常方便。
B+Tree非葉子節(jié)點(diǎn)只存儲(chǔ)索引index不存儲(chǔ)data,所以同樣大小的磁盤頁可以容納更多的節(jié)點(diǎn)元素

Mysql底層結(jié)構(gòu)

image.png

InnoDB

主鍵索引


輔助索引/聯(lián)合索引
image.png

MyISAM

主鍵索引

image.png

輔助索引/聯(lián)合索引
image.png

InnoDB與MyISAM區(qū)別

1.存儲(chǔ)格式
InnoDB:.frm存儲(chǔ)表結(jié)構(gòu)文件,字段長(zhǎng)度等 .ibd文件存儲(chǔ)數(shù)據(jù)信息和索引信息
MyISAM: .frm 描述表結(jié)構(gòu)文件,字段長(zhǎng)度等  .MYD(MYData)數(shù)據(jù)信息文件,存儲(chǔ)數(shù)據(jù)信息 
.MYI(MYIndex)索引信息文件

2.數(shù)據(jù)結(jié)構(gòu)
InnoDB與MyISAM底層都是采用B+Tree進(jìn)行存儲(chǔ),但是對(duì)于InnoDB來說B+Tree葉子節(jié)點(diǎn)存儲(chǔ)的是表的整條
數(shù)據(jù),對(duì)于MyISAM來說葉子節(jié)點(diǎn)存儲(chǔ)的是數(shù)據(jù)的地址

3.事務(wù)
InnoDB 支持事務(wù),MyISAM 不支持事務(wù)。這是 MySQL 將默認(rèn)存儲(chǔ)引擎從 MyISAM 變成 InnoDB 的重要
原因之一;

4.鎖
InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。一個(gè)更新語句會(huì)鎖住整張表,導(dǎo)致其他查詢和
更新都會(huì)被阻塞,因此并發(fā)訪問受限。這也是 MySQL 將默認(rèn)存儲(chǔ)引擎從 MyISAM 變成 InnoDB 的重要原因
之一

5.表的具體行數(shù)
MyISAM:保存有表的總行數(shù),如果select count() from table;會(huì)直接取出出該值。
InnoDB:沒有保存表的總行數(shù),如果使用select count() from table;就會(huì)遍歷整個(gè)表,消耗相當(dāng)大,
但是在加了wehre條件后,myisam和innodb處理的方式都一樣。

6. AUTO_INCREMENT
MyISAM:只支持表級(jí)鎖,用戶在操作myisam表時(shí),select,update,delete,insert語句都會(huì)給表自動(dòng)
加鎖,如果加鎖以后的表滿足insert并發(fā)的情況下,可以在表的尾部插入新的數(shù)據(jù)。
InnoDB:支持事務(wù)和行級(jí)鎖,是innodb的最大特色。行鎖大幅度提高了多用戶并發(fā)操作的新能。但是InnoDB的
行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會(huì)鎖全表的


7. 全文索引
MyISAM:支持 FULLTEXT類型的全文索引
InnoDB:不支持FULLTEXT類型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

8.表主鍵
MyISAM:允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
InnoDB:如果沒有設(shè)定主鍵或者非空唯一索引,就會(huì)自動(dòng)生成一個(gè)6字節(jié)的主鍵(用戶不可見),數(shù)據(jù)是主索引的
一部分,附加索引保存的是主索引的值的數(shù)據(jù)列。


9.CURD操作
MyISAM:如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。
InnoDB:如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表。DELETE從性
能上InnoDB更優(yōu),但DELETE FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的刪除,在innodb上如果
要清空保存有大量數(shù)據(jù)的表,最好使用truncate table這個(gè)命令。

10. 外鍵
MyISAM:不支持
InnoDB:支持
通過上述的分析,基本上可以考慮使用InnoDB來替代MyISAM引擎了,原因是InnoDB自身很多良好的特點(diǎn),比如
事務(wù)支持、存儲(chǔ) 過程、視圖、行級(jí)鎖定等等,在并發(fā)很多的情況下,相信InnoDB的表現(xiàn)肯定要比MyISAM強(qiáng)很多。
另外,任何一種表都不是萬能的,只用恰當(dāng)?shù)尼槍?duì)業(yè)務(wù)類型來選擇合適的表類型,才能最大的發(fā)揮MySQL的性能優(yōu)
勢(shì)。如果不是很復(fù)雜的Web應(yīng)用,非關(guān)鍵應(yīng)用,還是可以繼續(xù)考慮MyISAM的,這個(gè)具體情況可以自己斟酌。

漫畫之B樹與B+樹的區(qū)別

數(shù)據(jù)結(jié)構(gòu)可視化工具

InnoDB與MyISAM區(qū)別

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容