1、聚集索引
表數(shù)據(jù)按照索引的順序來(lái)存儲(chǔ)的,也就是說(shuō)索引項(xiàng)的順序與表中記錄的物理順序一致。對(duì)于聚集索引,葉子結(jié)點(diǎn)即存儲(chǔ)了真實(shí)的數(shù)據(jù)行,不再有另外單獨(dú)的數(shù)據(jù)頁(yè)。
在一張表上最多只能創(chuàng)建一個(gè)聚集索引,因?yàn)檎鎸?shí)數(shù)據(jù)的物理順序只能有一種。
從物理文件也可以看出 InnoDB(聚集索引)的數(shù)據(jù)文件只有數(shù)據(jù)結(jié)構(gòu)文件.frm和數(shù)據(jù)文件.idb 其中.idb中存放的是數(shù)據(jù)和索引信息 是存放在一起的。
2、非聚集索引
表數(shù)據(jù)存儲(chǔ)順序與索引順序無(wú)關(guān)。對(duì)于非聚集索引,葉結(jié)點(diǎn)包含索引字段值及指向數(shù)據(jù)頁(yè)數(shù)據(jù)行的邏輯指針,其行數(shù)量與數(shù)據(jù)表行數(shù)據(jù)量一致。
從物理文件中也可以看出 MyISAM(非聚集索引)的索引文件.MYI和數(shù)據(jù)文件.MYD是分開(kāi)存儲(chǔ)的 是相對(duì)獨(dú)立的
總結(jié):
聚簇索引和非聚簇索引的區(qū)別是:
聚簇索引(innoDB)的葉子節(jié)點(diǎn)就是數(shù)據(jù)節(jié)點(diǎn);
而非聚簇索引(myisam)的葉子節(jié)點(diǎn)仍然是索引文件 只是這個(gè)索引文件中包含指向?qū)?yīng)數(shù)據(jù)塊的指針
對(duì)于 非聚簇索引 來(lái)說(shuō),每次通過(guò)索引檢索到所需行號(hào)后,還需要通過(guò)葉子上的磁盤(pán)地址去磁盤(pán)內(nèi)取數(shù)據(jù)(回行)消耗時(shí)間。為了優(yōu)化這部分回行取數(shù)據(jù)時(shí)間,InnoDB 引擎采用了聚簇索引。
聚簇索引,即將數(shù)據(jù)存入索引葉子頁(yè)面上。對(duì)于 InnoDB 引擎來(lái)說(shuō),葉子頁(yè)面不再存該行對(duì)應(yīng)的地址,而是直接存儲(chǔ)數(shù)據(jù)。
這樣便避免了回行操作所帶來(lái)的時(shí)間消耗。 使得 InnoDB 在某些查詢上比 MyISAM 還要快!
ps. 關(guān)于查詢時(shí)間,一般認(rèn)為 MyISAM 犧牲了功能換取了性能,查詢更快。但事實(shí)并不一定如此。多數(shù)情況下,MyISAM 確實(shí)比 InnoDB 查的快 。但是查詢時(shí)間受多方面因素影響。InnoDB 查詢變慢得原因是因?yàn)橹С质聞?wù)、回滾等等,使得 InnoDB的葉子頁(yè)面實(shí)際上還包含有事務(wù)id(換句話說(shuō)就是版本號(hào)) 以及回滾指針。
動(dòng)作描述 | 使用聚集索引 | 使用非聚集索引 |
列經(jīng)常被分組排序 | 使用 | 使用 |
返回某范圍內(nèi)的數(shù)據(jù) | 使用 | 不使用 |
一個(gè)或極少不同值 | 不使用 | 不使用 |
小數(shù)目的不同值 | 使用 | 不使用 |
大數(shù)目的不同值 | 不使用 | 使用 |
頻繁更新的列 | 不使用 | 使用 |
外鍵列 | 使用 | 使用 |
主鍵列 | 使用 | 使用 |
頻繁修改索引列 | 不使用 | 使用 |
簡(jiǎn)單來(lái)說(shuō),聚簇索引不適用于頻繁更新的列、頻繁修改的索引列和小數(shù)目的不同值。
以上就是詳解MySQL 聚簇索引與非聚簇索引的詳細(xì)內(nèi)容,更多關(guān)于MySQL 聚簇索引與非聚簇索引的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:惠州 沈陽(yáng) 合肥 天津 呼和浩特 公主嶺 牡丹江 阿里
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解MySQL 聚簇索引與非聚簇索引》,本文關(guān)鍵詞 詳解,MySQL,聚簇,索引,與,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。