MySQL的存儲(chǔ)引擎和數(shù)據(jù)結(jié)構(gòu)

一. 存儲(chǔ)引擎的數(shù)據(jù)結(jié)構(gòu)

1. B樹(B-樹)

B樹是2-3樹的一種擴(kuò)展,對(duì)于M階(M就是樹的高度,比如下圖為一個(gè)四階的樹)的B樹來說:

(1)根節(jié)點(diǎn)至少有兩個(gè)子節(jié)點(diǎn)

(2)每個(gè)節(jié)點(diǎn)至多有M-1個(gè)key,以升序排列,以及Nk+1個(gè)指針,其中Nk代表key的數(shù)量。

(3)對(duì)于一個(gè)key1來說,它左側(cè)的指針指向的子節(jié)點(diǎn)的key值<=key1,右側(cè)子指針指向的子節(jié)點(diǎn)的key值>key1(詳見下圖)

(4)其他節(jié)點(diǎn)至少有M/2個(gè)子節(jié)點(diǎn)


關(guān)于B樹中插入節(jié)點(diǎn)的過程,在下面這個(gè)博客中有一個(gè)動(dòng)圖解釋的很詳細(xì):

http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html

他的插入過程和紅黑樹很相似,總結(jié)一下就是:

(1)當(dāng)要插入一個(gè)新值時(shí),首先根據(jù)第三條原則找到他在葉子節(jié)點(diǎn)的位置并插入

(2)如果當(dāng)前葉子節(jié)點(diǎn)的key數(shù)目等于M,那么就要拆分,拆分的過程就是把所有key通過一個(gè)中間值(如M=4取第二個(gè)數(shù),M=5取第三個(gè)數(shù)),分成相同的兩份(如果M是偶數(shù)會(huì)相差一),然后中間數(shù)為父節(jié)點(diǎn),兩邊的樹作為左右子節(jié)點(diǎn),但要注意中間數(shù)是插入到他們的父節(jié)點(diǎn)中的,而不是新生成一棵樹,這也就意味著如果這時(shí)候父節(jié)點(diǎn)的key樹等于M,那么就要通過相同的變換把key值接著向上傳遞,直到key數(shù)<M。

2. B+樹

存儲(chǔ)引擎常用的一種數(shù)據(jù)結(jié)構(gòu),一種多叉平衡查找樹,特點(diǎn)(對(duì)于M階的B+樹):

(1)除葉子結(jié)點(diǎn)外所有節(jié)點(diǎn)都有M個(gè)鍵以及M個(gè)指向子節(jié)點(diǎn)的指針。

(2)所有葉子節(jié)點(diǎn)都在同一層?

(3)非葉子結(jié)點(diǎn)的子樹指針與關(guān)鍵字(Key)個(gè)數(shù)相同;?

(4)非葉子結(jié)點(diǎn)的子樹指針P[i],指向關(guān)鍵字值屬于[K[i], K[i+1])的子樹(B-樹是開區(qū)間);?

(5)為所有葉子結(jié)點(diǎn)增加一個(gè)鏈指針;?

(6)所有關(guān)鍵字(key)都在葉子結(jié)點(diǎn)出現(xiàn);,因此所有查找只會(huì)在葉子結(jié)點(diǎn)命中

結(jié)構(gòu)如下圖所示:


相比B樹的優(yōu)點(diǎn):

(1)支持范圍查找

(2)遍歷更方便

(3)節(jié)省空間:因?yàn)锽+樹只有葉子節(jié)點(diǎn)才存數(shù)據(jù),因此內(nèi)部節(jié)點(diǎn)不需要只想關(guān)鍵字具體信息的指針。

(4)所有查詢操作都需要命中子節(jié)點(diǎn),所以是相同的。

PS: B*樹就是在B+樹基礎(chǔ)上,為非葉子結(jié)點(diǎn)也增加鏈表指針

二. MyISAM引擎

不支持事務(wù)

支持表級(jí)鎖(MySql支持兩種表級(jí)鎖,表共享讀鎖和表獨(dú)占寫鎖),但不支持行級(jí)鎖

存儲(chǔ)表的總行數(shù)

一個(gè)MyISAM表有三個(gè)文件:索引文件(.MYI),表結(jié)構(gòu)文件(.frm),數(shù)據(jù)文件(.MYD)

采用非聚集索引:即索引文件和數(shù)據(jù)文件是分開的,索引文件的數(shù)據(jù)域存儲(chǔ)指向數(shù)據(jù)文件的指針

跨平臺(tái)應(yīng)用更方便(表保存為文件形式)

支持三種不同的存儲(chǔ)格式:

(1)靜態(tài)表:存儲(chǔ)迅速,容易緩存,出現(xiàn)故障容易恢復(fù);但是占用內(nèi)存多,因?yàn)闀?huì)按列寬度補(bǔ)足空格

(2)動(dòng)態(tài)表:占用空間少,但是頻繁更新和刪除容易產(chǎn)生碎片,需要定期整理(OPTIMIZE TABLE),并且出現(xiàn)故障難以恢復(fù)。

(3)壓縮表:占據(jù)的磁盤空間非常小(每個(gè)記錄被單獨(dú)壓縮,所以訪問開支很小)。

三. InnoDb引擎

支持事務(wù)

支持行級(jí)鎖(僅在條件語句中包括主鍵索引時(shí))

內(nèi)存使用率低

查詢效率和寫的效率更低

采用聚集索引,索引和數(shù)據(jù)存在一起,葉子結(jié)點(diǎn)直接存的是數(shù)據(jù)。

支持外鍵

注:MyISAM在查詢時(shí)的性能比InnoDB高,因?yàn)樗捎玫妮o索引和主鍵索引類似,所以通過輔索引查找數(shù)據(jù)時(shí)只需要通過輔索引樹就可以查找到,而InnoDB需要先通過輔索引查找到主索引,再通過主索引樹查找到數(shù)據(jù)。

四. MEMORY

只對(duì)應(yīng)一個(gè)磁盤文件.frm,用來存儲(chǔ)表結(jié)構(gòu)

訪問速度非常快,因?yàn)樗臄?shù)據(jù)存在內(nèi)存中,但是一旦服務(wù)關(guān)閉,數(shù)據(jù)就會(huì)丟失

可以指定Hash索引或BTREE索引

默認(rèn)存儲(chǔ)數(shù)據(jù)大小不超過16MB,但可以調(diào)整

應(yīng)用場景:比如作為統(tǒng)計(jì)操作的的中間結(jié)果表,便于高效地對(duì)中間結(jié)果分析并得到最終結(jié)果。

五. MERGE

一組MyISAM表的組合,這些MyISAM表結(jié)構(gòu)必須完全相同

對(duì)MERGE表的操作實(shí)際上是對(duì)其子表進(jìn)行的

可以通過指定INSERT_METHOD=LAST來制定插入數(shù)據(jù)的表(這里指定為最后一個(gè)表)

參考:

[1] 《深入淺出MySQL》

[2] 平衡查找樹之B樹:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html

[3] B樹,B+樹,B*樹:http://www.lxweimin.com/p/db226e0196b4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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