Mysql-聚簇索引

整體概述

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ù)塊。

用圖說明下:

Mysql-聚簇索引

Mysql-聚簇索引

看到了把,不同引擎下的類型是不一樣的。

主要區(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)分裂的情況。

Mysql-聚簇索引

映射結(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 (該字段寫入了多少頁 )

Mysql-聚簇索引

在隨機(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)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享