1分鐘搞定MyISAM與InnoDB的索引差異

B+樹(shù),它是一種非常適合用來(lái)做數(shù)據(jù)庫(kù)索引的數(shù)據(jù)結(jié)構(gòu):

創(chuàng)新互聯(lián),是成都地區(qū)的互聯(lián)網(wǎng)解決方案提供商,用心服務(wù)為企業(yè)提供網(wǎng)站建設(shè)、成都app軟件開(kāi)發(fā)公司小程序開(kāi)發(fā)、系統(tǒng)專業(yè)公司和微信代運(yùn)營(yíng)服務(wù)。經(jīng)過(guò)數(shù)十余年的沉淀與積累,沉淀的是技術(shù)和服務(wù),讓客戶少走彎路,踏實(shí)做事,誠(chéng)實(shí)做人,用情服務(wù),致力做一個(gè)負(fù)責(zé)任、受尊敬的企業(yè)。對(duì)客戶負(fù)責(zé),就是對(duì)自己負(fù)責(zé),對(duì)企業(yè)負(fù)責(zé)。

(1)很適合磁盤(pán)存儲(chǔ),能夠充分利用局部性原理,磁盤(pán)預(yù)讀;

(2)很低的樹(shù)高度,能夠存儲(chǔ)大量數(shù)據(jù);

(3)索引本身占用的內(nèi)存很??;

(4)能夠很好的支持單點(diǎn)查詢,范圍查詢,有序性查詢;

?

數(shù)據(jù)庫(kù)的索引分為主鍵索引(Primary Inkex)與普通索引(Secondary Index)。InnoDB和MyISAM是怎么利用B+樹(shù)來(lái)實(shí)現(xiàn)這兩類索引,其又有什么差異呢?這是今天要聊的內(nèi)容。

?

一,MyISAM的索引

MyISAM的索引與行記錄是分開(kāi)存儲(chǔ)的,叫做非聚集索引(UnClustered Index)。

?

其主鍵索引與普通索引沒(méi)有本質(zhì)差異:

有連續(xù)聚集的區(qū)域單獨(dú)存儲(chǔ)行記錄

主鍵索引的葉子節(jié)點(diǎn),存儲(chǔ)主鍵,與對(duì)應(yīng)行記錄的指針

普通索引的葉子結(jié)點(diǎn),存儲(chǔ)索引列,與對(duì)應(yīng)行記錄的指針

畫(huà)外音:MyISAM的表可以沒(méi)有主鍵。

?

主鍵索引與普通索引是兩棵獨(dú)立的索引B+樹(shù),通過(guò)索引列查找時(shí),先定位到B+樹(shù)的葉子節(jié)點(diǎn),再通過(guò)指針定位到行記錄。

?

舉個(gè)例子,MyISAM:

t(id PK, name KEY, sex, flag);

?

表中有四條記錄:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B
1分鐘搞定 MyISAM與InnoDB的索引差異
?

其B+樹(shù)索引構(gòu)造如上圖:

行記錄單獨(dú)存儲(chǔ)

id為PK,有一棵id的索引樹(shù),葉子指向行記錄

name為KEY,有一棵name的索引樹(shù),葉子也指向行記錄

?

二、InnoDB的索引

InnoDB的主鍵索引與行記錄是存儲(chǔ)在一起的,故叫做聚集索引(Clustered Index):

沒(méi)有單獨(dú)區(qū)域存儲(chǔ)行記錄

主鍵索引的葉子節(jié)點(diǎn),存儲(chǔ)主鍵,與對(duì)應(yīng)行記錄(而不是指針)

畫(huà)外音:因此,InnoDB的PK查詢是非??斓?。

?

因?yàn)檫@個(gè)特性,InnoDB的表必須要有聚集索引:

(1)如果表定義了PK,則PK就是聚集索引;

(2)如果表沒(méi)有定義PK,則第一個(gè)非空unique列是聚集索引;

(3)否則,InnoDB會(huì)創(chuàng)建一個(gè)隱藏的row-id作為聚集索引;

?

聚集索引,也只能夠有一個(gè),因?yàn)閿?shù)據(jù)行在物理磁盤(pán)上只能有一份聚集存儲(chǔ)。

?

InnoDB的普通索引可以有多個(gè),它與聚集索引是不同的:

普通索引的葉子節(jié)點(diǎn),存儲(chǔ)主鍵(也不是指針)

?

對(duì)于InnoDB表,這里的啟示是:

(1)不建議使用較長(zhǎng)的列做主鍵,例如char(64),因?yàn)樗械钠胀ㄋ饕紩?huì)存儲(chǔ)主鍵,會(huì)導(dǎo)致普通索引過(guò)于龐大;

(2)建議使用趨勢(shì)遞增的key做主鍵,由于數(shù)據(jù)行與索引一體,這樣不至于插入記錄時(shí),有大量索引分裂,行記錄移動(dòng);

?

仍是上面的例子,只是存儲(chǔ)引擎換成InnoDB:

t(id PK, name KEY, sex, flag);

?

表中還是四條記錄:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B
1分鐘搞定 MyISAM與InnoDB的索引差異

其B+樹(shù)索引構(gòu)造如上圖:

id為PK,行記錄和id索引樹(shù)存儲(chǔ)在一起

name為KEY,有一棵name的索引樹(shù),葉子存儲(chǔ)id

?

當(dāng):

select * from t where name=‘lisi’;

1分鐘搞定 MyISAM與InnoDB的索引差異

會(huì)先通過(guò)name輔助索引定位到B+樹(shù)的葉子節(jié)點(diǎn)得到id=5,再通過(guò)聚集索引定位到行記錄。

畫(huà)外音:所以,其實(shí)掃了2遍索引樹(shù)。

當(dāng)前標(biāo)題:1分鐘搞定MyISAM與InnoDB的索引差異
文章出自:http://www.muchs.cn/article28/geescp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、域名注冊(cè)、虛擬主機(jī)網(wǎng)站導(dǎo)航、Google品牌網(wǎng)站建設(shè)

廣告

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

h5響應(yīng)式網(wǎng)站建設(shè)