整體概述
1.innodb的主索引文件上 直接存放該行數(shù)據(jù),稱為聚簇索引,次索引指向?qū)χ麈I的引用
2.myisam中,主索引和次索引,都指向物理行(磁盤位置)
哈哈,說了兩句貌似聽不懂的話。
一。通俗解釋
我們可以這么理解:
聚簇索引(innodb):索引的葉節(jié)點(diǎn)就是數(shù)據(jù)節(jié)點(diǎn),下邊實(shí)打?qū)嵱袛?shù)據(jù)。
非聚簇索引(myisam): 葉節(jié)點(diǎn)仍然是索引節(jié)點(diǎn),有指針指向?qū)?yīng)的數(shù)據(jù)塊。
用圖說明下:
看到了把,不同引擎下的類型是不一樣的。
主要區(qū)別是葉子節(jié)點(diǎn)下是否有數(shù)據(jù)塊。
(沒有主鍵他也會(huì)創(chuàng)建一個(gè)的..innodb都是聚簇索引來組織的)
二。優(yōu)缺點(diǎn):
分裂問題:
既然是樹結(jié)構(gòu),葉子節(jié)點(diǎn)可能會(huì)有分裂現(xiàn)象
那么問題來了,
對(duì)于非聚簇索引(myisam),節(jié)點(diǎn)下存儲(chǔ)的對(duì)物理行地址,內(nèi)容較小,有緩存在內(nèi)存中,分裂快。
對(duì)于聚簇索引(innodb),這個(gè)問題比較嚴(yán)重,節(jié)點(diǎn)下存儲(chǔ)這“行數(shù)據(jù)”
因?yàn)楣?jié)點(diǎn)下有數(shù)據(jù)文件,因此節(jié)點(diǎn)的分裂會(huì)比較慢,innodb的主鍵,盡量用整形而且的遞增的整形,如果無規(guī)律的主鍵數(shù)據(jù),在葉子節(jié)點(diǎn)存儲(chǔ)時(shí),會(huì)分裂,分裂的過程得帶著“行數(shù)據(jù)”重新分,而myisam只記錄了一個(gè)地址,只要把地址分裂替換即可。
舉例子:
比如,分裂就像是一個(gè)搬家的過程,對(duì)于聚簇索引(innodb),搬家真的要把家里的所有數(shù)據(jù)全分裂搬走,而非聚簇索引(mysiam),只需要把記錄家的門牌號(hào)搬走很容易,至于其指向的數(shù)據(jù)其實(shí)不用搬。
三。測(cè)試論證:
在innodb引擎下,規(guī)律,無規(guī)律 兩種方式插入1000條數(shù)據(jù)。
經(jīng)過測(cè)試,第一種主鍵順序遞增的形式插入,37秒;第二種打亂順序的插入,42秒,整整慢了5秒,預(yù)測(cè)原因是因?yàn)閬y序插入,需要進(jìn)行葉子節(jié)點(diǎn)的分裂,它得搬家消耗了時(shí)間,也就是說時(shí)間差在了節(jié)點(diǎn)的分裂和頁面的移動(dòng);而順序插入的很少發(fā)生節(jié)點(diǎn)分裂的情況。
映射結(jié)論:
1.讀操作多用mysiam引擎
2.選擇單調(diào)性的數(shù)據(jù)為索引,會(huì)快一點(diǎn)
更多:Mysql-索引總結(jié)
下邊驗(yàn)證一下:
show variables like “%innodb%”
show status;
會(huì)發(fā)現(xiàn)有一個(gè)字段->innodb_pages_written (該字段寫入了多少頁 )
在隨機(jī)寫入時(shí),寫入頁的次數(shù)要高于順序?qū)懭氲模褪且驗(yàn)榉至岩苿?dòng),所以寫的次數(shù)多,時(shí)間也用的多,也解釋了為什么這兩種會(huì)存在5秒事件差了。
MyISAM:
這個(gè)是默認(rèn)類型,它是基于傳統(tǒng)的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲(chǔ)記錄和文件的標(biāo)準(zhǔn)方法.與其他存儲(chǔ)引擎比較,MyISAM具有檢查和修復(fù)表格的大多數(shù)工具. MyISAM表格可以被壓縮,而且它們支持全文搜索.它們不是事務(wù)安全的,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執(zhí)行大量 的SELECT,MyISAM是更好的選擇。
InnoDB:
這種類型是事務(wù)安全的.它與BDB類型具有相同的特性,它們還支持外鍵.InnoDB表格速度很快.具有比BDB還豐富的特性,因此如果需 要一個(gè)事務(wù)安全的存儲(chǔ)引擎,建議使用它.如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表
以上就是Mysql-聚簇索引的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!