個(gè)人能力有限,如有錯(cuò)誤請(qǐng)指出,共同學(xué)習(xí)。
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、句容網(wǎng)絡(luò)推廣、小程序制作、句容網(wǎng)絡(luò)營(yíng)銷、句容企業(yè)策劃、句容品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供句容建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
二叉樹
B樹
B+樹
特點(diǎn):
聚簇索引
二級(jí)索引
key數(shù)據(jù)存儲(chǔ)量估算:
若每個(gè)頁(yè)可以存1000個(gè)key,而且樹的高度是4,那么
前提條件如下:
插入步驟
步驟一
因?yàn)樗饕羞€沒有數(shù)據(jù),所以此時(shí)的B+樹只有一個(gè)空的根結(jié)點(diǎn),又由于一個(gè)頁(yè)只能存3個(gè)key,首先將10,20,5插入進(jìn)去(實(shí)際上此步發(fā)生了3次插入),然后在頁(yè)面內(nèi)做數(shù)據(jù)排序,最終結(jié)果如下圖:
步驟二:
由于根頁(yè)面已經(jīng)寫滿,此時(shí)插入8,將發(fā)生分裂(根頁(yè)面分裂),大致步驟如下:
注意:在分裂過程中,根結(jié)點(diǎn)始終是不會(huì)變的,不管變成多大的樹,根結(jié)點(diǎn)的頁(yè)面號(hào)始終如一。
步驟五:
插入數(shù)據(jù)40,發(fā)現(xiàn)比根結(jié)點(diǎn)23大,找到103號(hào)頁(yè)面,發(fā)現(xiàn)已滿,執(zhí)行分裂,分裂同上面葉子結(jié)點(diǎn)的分裂步驟。分裂后如圖所示:
步驟六:
繼續(xù)插入下一個(gè)數(shù)據(jù)9,因?yàn)楸?0小,找到101號(hào)頁(yè)面,發(fā)現(xiàn)已滿,需要做葉子結(jié)點(diǎn)分裂,如下圖:
傳統(tǒng)B+樹的數(shù)據(jù)刪除,一般都會(huì)有一個(gè)所謂的填充因子,來控制頁(yè)面數(shù)據(jù)的刪除比例,如果數(shù)據(jù)量小于這個(gè)填充因子所表示的數(shù)據(jù)量,就會(huì)有節(jié)點(diǎn)合并,這與分裂是相對(duì)應(yīng)的。
InnoDB的實(shí)現(xiàn)與傳統(tǒng)B+樹算法有不同之處,InnoDB在刪除索引數(shù)據(jù)時(shí),會(huì)先檢查當(dāng)前頁(yè)剩余的記錄數(shù),如果只剩下一條記錄,就會(huì)直接將這個(gè)頁(yè)面從B+樹中摘除,也只有這種情況,InnoDB才會(huì)回收一個(gè)頁(yè)面,InnoDB的頁(yè)面沒有合并一說,但是對(duì)于根節(jié)點(diǎn),即使索引數(shù)據(jù)全部刪除,根節(jié)點(diǎn)頁(yè)依然存在,只不過是以空頁(yè)的形式存在。
下面舉個(gè)例子描述索引刪除過程,前提條件與前面插入記錄時(shí)一致。
刪除數(shù)據(jù) 50
刪除過程全部結(jié)束,最終得到一個(gè)空的索引頁(yè)。
《MySQL運(yùn)維內(nèi)參》
B+樹動(dòng)畫演示:
向MYSql的數(shù)據(jù)表中存入文件,只要把文件存入longblob字段就行了。
先從數(shù)據(jù)結(jié)構(gòu)的角度來答。
題主應(yīng)該知道B-樹和B+樹最重要的一個(gè)區(qū)別就是B+樹只有葉節(jié)點(diǎn)存放數(shù)據(jù),其余節(jié)點(diǎn)用來索引,而B-樹是每個(gè)索引節(jié)點(diǎn)都會(huì)有Data域。
這就決定了B+樹更適合用來存儲(chǔ)外部數(shù)據(jù),也就是所謂的磁盤數(shù)據(jù)。
從Mysql(Inoodb)的角度來看,B+樹是用來充當(dāng)索引的,一般來說索引非常大,尤其是關(guān)系性數(shù)據(jù)庫(kù)這種數(shù)據(jù)量大的索引能達(dá)到億級(jí)別,所以為了減少內(nèi)存的占用,索引也會(huì)被存儲(chǔ)在磁盤上。
那么Mysql如何衡量查詢效率呢?磁盤IO次數(shù),B-樹(B類樹)的特定就是每層節(jié)點(diǎn)數(shù)目非常多,層數(shù)很少,目的就是為了就少磁盤IO次數(shù),當(dāng)查詢數(shù)據(jù)的時(shí)候,最好的情況就是很快找到目標(biāo)索引,然后讀取數(shù)據(jù),使用B+樹就能很好的完成這個(gè)目的,但是B-樹的每個(gè)節(jié)點(diǎn)都有data域(指針),這無疑增大了節(jié)點(diǎn)大小,說白了增加了磁盤IO次數(shù)(磁盤IO一次讀出的數(shù)據(jù)量大小是固定的,單個(gè)數(shù)據(jù)變大,每次讀出的就少,IO次數(shù)增多,一次IO多耗時(shí)啊?。鳥+樹除了葉子節(jié)點(diǎn)其它節(jié)點(diǎn)并不存儲(chǔ)數(shù)據(jù),節(jié)點(diǎn)小,磁盤IO次數(shù)就少。這是優(yōu)點(diǎn)之一。
另一個(gè)優(yōu)點(diǎn)是什么,B+樹所有的Data域在葉子節(jié)點(diǎn),一般來說都會(huì)進(jìn)行一個(gè)優(yōu)化,就是將所有的葉子節(jié)點(diǎn)用指針串起來。這樣遍歷葉子節(jié)點(diǎn)就能獲得全部數(shù)據(jù),這樣就能進(jìn)行區(qū)間訪問啦。
至于MongoDB為什么使用B-樹而不是B+樹,可以從它的設(shè)計(jì)角度來考慮,它并不是傳統(tǒng)的關(guān)系性數(shù)據(jù)庫(kù),而是以Json格式作為存儲(chǔ)的nosql,目的就是高性能,高可用,易擴(kuò)展。首先它擺脫了關(guān)系模型,上面所述的優(yōu)點(diǎn)2需求就沒那么強(qiáng)烈了,其次Mysql由于使用B+樹,數(shù)據(jù)都在葉節(jié)點(diǎn)上,每次查詢都需要訪問到葉節(jié)點(diǎn),而MongoDB使用B-樹,所有節(jié)點(diǎn)都有Data域,只要找到指定索引就可以進(jìn)行訪問,無疑單次查詢平均快于Mysql(但側(cè)面來看Mysql至少平均查詢耗時(shí)差不多)。
總體來說,Mysql選用B+樹和MongoDB選用B-樹還是以自己的需求來選擇的。
1、復(fù)制mysql代碼。
2、進(jìn)入空間,找到自定義,點(diǎn)擊自定義。
3、將代碼粘貼到地址欄里。
4、按Enter鍵點(diǎn)擊保存即可。