一. 存儲(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