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

         對于InnoDB存儲引擎的表,記錄默認(rèn)會按一定順序保存,如果有明確定義的主鍵,則按照主鍵順序保存。如果沒有主鍵,但是有唯一索引,就按照唯一索引的順序保存。如果既沒有主鍵也沒有唯一索引,表中會自動(dòng)生成一個(gè)內(nèi)部列,按照這個(gè)列的順序保存。按照主鍵或內(nèi)部列的訪問是最快的,索引InnoDB表盡量自己指定主鍵,當(dāng)表中同時(shí)有幾個(gè)列都是唯一的,都可以作為主鍵的時(shí)候,要選擇最常作為訪問條件的列作為主鍵,提高查詢效率。另外,InnoDB表的普通索引都會保存主鍵的鍵值,這樣通過對索引加鎖就可以實(shí)現(xiàn)行級鎖。

成都創(chuàng)新互聯(lián)公司長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為靖西企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì),靖西網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

        可以說數(shù)據(jù)庫必須有索引,沒有索引則檢索過程變成了順序查找,O(n)的時(shí)間復(fù)雜度幾乎是不能忍受的。我們非常容易想象出一個(gè)只有單關(guān)鍵字組成的表如何使用B+樹進(jìn)行索引,只要將關(guān)鍵字存儲到樹的節(jié)點(diǎn)即可。當(dāng)數(shù)據(jù)庫一條記錄里包含多個(gè)字段時(shí),一棵B+樹就只能存儲主鍵,如果檢索的是非主鍵字段,則主鍵索引失去作用,又變成順序查找了。這時(shí)應(yīng)該在第二個(gè)要檢索的列上建立第二套索引。  這個(gè)索引由獨(dú)立的B+樹來組織。有兩種常見的方法可以解決多個(gè)B+樹訪問同一套表數(shù)據(jù)的問題,一種叫做聚簇索引(clustered index ),一種叫做非聚簇索引(secondary index)。這兩個(gè)名字雖然都叫做索引,但這并不是一種單獨(dú)的索引類型,而是一種數(shù)據(jù)存儲方式。對于聚簇索引存儲來說,行數(shù)據(jù)和主鍵B+樹存儲在一起,輔助鍵B+樹只存儲輔助鍵和主鍵,主鍵和非主鍵B+樹幾乎是兩種類型的樹。對于非聚簇索引存儲來說,主鍵B+樹在葉子節(jié)點(diǎn)存儲指向真正數(shù)據(jù)行的指針,而非主鍵。

     InnoDB使用的是聚簇索引,將主鍵組織到一棵B+樹中,而行數(shù)據(jù)就儲存在葉子節(jié)點(diǎn)上,若使用"where id = 14"這樣的條件查找主鍵,則按照B+樹的檢索算法即可查找到對應(yīng)的葉節(jié)點(diǎn),之后獲得行數(shù)據(jù)。若對Name列進(jìn)行條件搜索,則需要兩個(gè)步驟:第一步在輔助索引B+樹中檢索Name,到達(dá)其葉子節(jié)點(diǎn)獲取對應(yīng)的主鍵。第二步使用主鍵在主索引B+樹種再執(zhí)行一次B+樹檢索操作,最終到達(dá)葉子節(jié)點(diǎn)即可獲取整行數(shù)據(jù)。

     MyISM使用的是非聚簇索引,非聚簇索引的兩棵B+樹看上去沒什么不同,節(jié)點(diǎn)的結(jié)構(gòu)完全一致只是存儲的內(nèi)容不同而已,主鍵索引B+樹的節(jié)點(diǎn)存儲了主鍵,輔助鍵索引B+樹存儲了輔助鍵。表數(shù)據(jù)存儲在獨(dú)立的地方,這兩顆B+樹的葉子節(jié)點(diǎn)都使用一個(gè)地址指向真正的表數(shù)據(jù),對于表數(shù)據(jù)來說,這兩個(gè)鍵沒有任何差別。由于索引樹是獨(dú)立的,通過輔助鍵檢索無需訪問主鍵的索引樹。

        為了更形象說明這兩種索引的區(qū)別,我們假想一個(gè)表如下圖存儲了4行數(shù)據(jù)。其中Id作為主索引,Name作為輔助索引。圖示清晰的顯示了聚簇索引和非聚簇索引的差異。

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

聚簇索引優(yōu)點(diǎn):

1查詢速度更快:由于行數(shù)據(jù)和葉子節(jié)點(diǎn)存儲在一起,這樣主鍵和行數(shù)據(jù)是一起被載入內(nèi)存的,找到葉子節(jié)點(diǎn)就可以立刻將行數(shù)據(jù)返回了,如果按照主鍵Id來組織數(shù)據(jù),獲得數(shù)據(jù)更快。

2減少索引維護(hù):輔助索引使用主鍵作為"指針"而不是使用地址值作為指針的好處是,減少了當(dāng)出現(xiàn)行移動(dòng)或者數(shù)據(jù)頁分裂時(shí)輔助索引的維護(hù)工作,使用主鍵值當(dāng)作指針會讓輔助索引占用更多的空間,換來的好處是InnoDB在移動(dòng)行時(shí)無須更新輔助索引中的這個(gè)"指針"。也就是說行的位置(實(shí)現(xiàn)中通過16K的Page來定位,后面會涉及)會隨著數(shù)據(jù)庫里數(shù)據(jù)的修改而發(fā)生變化(前面的B+樹節(jié)點(diǎn)分裂以及Page的分裂),使用聚簇索引就可以保證不管這個(gè)主鍵B+樹的節(jié)點(diǎn)如何變化,輔助索引樹都不受影響。

 

InnoDB行鎖的實(shí)現(xiàn):

 

InnoDB的行鎖是加在索引上的,實(shí)現(xiàn)過程如下:

 

1.按輔助索引檢索:行鎖加在輔助索引對應(yīng)的列,并根據(jù)主鍵項(xiàng)找到主鍵索引加鎖。

如上圖,按name字段檢索name='Ellision',Ellision索引列會加鎖,并在主鍵索引項(xiàng)14加鎖。這樣當(dāng)其他事務(wù)就無法訪問name='Ellision'列,也無法根據(jù)其他數(shù)據(jù)項(xiàng)訪問相應(yīng)的數(shù)據(jù)列。

網(wǎng)站名稱:InnoDB索引實(shí)現(xiàn)
網(wǎng)頁鏈接:http://bm7419.com/article8/psspip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、微信公眾號網(wǎng)站營銷、、網(wǎng)站設(shè)計(jì)公司網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)