MySQL之MyISAM存儲(chǔ)引擎的非聚簇索引詳解
在InnoDB中索引即數(shù)據(jù),也就是聚簇索引的那顆B+樹的葉子節(jié)點(diǎn)中已經(jīng)包含了所有完整的用戶記錄。MyISAM的索引方案雖然也是使用樹形結(jié)構(gòu),但是卻將索引和數(shù)據(jù)分開存儲(chǔ),這種索引也叫非聚簇索引。
create table index_demo( c1 int, c2 int, c3 char(1), primary key(c1) ) ROW_FORMAT=COMPACT;
將表中的記錄按照記錄的插入順序單獨(dú)存儲(chǔ)在一個(gè)文件中,這個(gè)文件并不劃分為若干個(gè)數(shù)據(jù)頁,有多少記錄就往這個(gè)文件中塞多少個(gè)記錄,這樣一來,我們就可以通過行號(hào)快速訪問到一條記錄。在表中使用MyISAM作為存儲(chǔ)引擎時(shí),它的記錄在存儲(chǔ)空間中的表示如圖:

由于在插入數(shù)據(jù)時(shí)并沒有刻意按照主鍵大小排序,所以我們不能再這些數(shù)據(jù)上使用二分法進(jìn)行查找,使用MyISAM存儲(chǔ)引擎的表會(huì)把索引信息單獨(dú)存儲(chǔ)在另外一個(gè)文件中,稱為索引文件。MyISAM會(huì)為表的主鍵單獨(dú)創(chuàng)建一個(gè)索引,只不過在索引的葉子節(jié)點(diǎn)中存儲(chǔ)的不是完整的用戶記錄,而是主鍵值和行號(hào)的組合。也就是先通過索引找到對(duì)應(yīng)的行號(hào),再通過行號(hào)去找對(duì)應(yīng)的記錄。

在InnoDB存儲(chǔ)引擎中,我們只需要根據(jù)主鍵值對(duì)聚簇索引進(jìn)行一次查找就能找到對(duì)應(yīng)的記錄;在MyISAM存儲(chǔ)引擎中,需要進(jìn)行一次回表操作,這也意味著MyISAM中建立的索引相當(dāng)于全部都是二級(jí)索引。
MyISAM會(huì)直接在索引葉子節(jié)點(diǎn)處存儲(chǔ)該條記錄在數(shù)據(jù)文件中的地址偏移量。由此可以看出MyISAM的回表操作時(shí)十分快速的,因?yàn)樗悄弥刂菲屏恐苯拥轿募腥?shù)據(jù),而InnoDB是通過獲取主鍵之后再去聚簇索引中找記錄,雖然說不慢,但是也比不上直接用地址去訪問。
如果有必要,我們也可以為其他列分別建立索引或者建立聯(lián)合索引,其原理與InnoDB中索引差不多,只不過在葉子節(jié)點(diǎn)處存儲(chǔ)的是相應(yīng)的列+行號(hào),這些索引頁全部都是二級(jí)索引。

可以看到對(duì)于非聚簇索引,不管是以主鍵為排序規(guī)則還是以非主鍵為排序規(guī)則,它的結(jié)構(gòu)都是相同的,即葉子節(jié)點(diǎn)存放的都是相應(yīng)的列+行號(hào)。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
MySQL5.6 GTID模式下同步復(fù)制報(bào)錯(cuò)不能跳過的解決方法
搭建虛擬機(jī)centos6.0, mysql5.6.10主從復(fù)制,死活不同步,搞了一整天找到這篇文章終于OK了,特分享一下,需要的朋友可以參考下2020-04-04
分享CentOS下MySQL最新版本5.6.13源碼安裝過程
這篇文章主要介紹了CentOS下安裝MySQL最新版本5.6.13過程分享,需要的朋友可以參考下2014-02-02
mysql時(shí)間戳格式化函數(shù)from_unixtime使用的簡(jiǎn)單說明
mysql中的FROM_UNIXTIME函數(shù)可以數(shù)據(jù)庫中整型類的時(shí)間戳格式化為字符串的日期時(shí)間格式,下面這篇文章主要給大家介紹了關(guān)于mysql時(shí)間戳格式化函數(shù)from_unixtime使用的簡(jiǎn)單說明,需要的朋友可以參考下2022-08-08
MySQL全文索引在數(shù)據(jù)庫中的應(yīng)用和優(yōu)勢(shì)(模糊查詢不用like+%)
全文索引技術(shù)可以有效地從大量文本中檢索信息,適用于搜索引擎和電商平臺(tái)等場(chǎng)景,InnoDB從MySQL5.6開始支持全文索引,使用倒排索引實(shí)現(xiàn),全文檢索分為自然語言搜索、布爾搜索和查詢擴(kuò)展搜索三種模式,全文索引提高了模糊查詢的效率,優(yōu)化了基于文本的搜索查詢2024-09-09
Mysql進(jìn)行操作時(shí)鎖的具體行為示例詳解
MySQL鎖的使用需要根據(jù)具體的應(yīng)用場(chǎng)景來選擇,例如,如果應(yīng)用以查詢?yōu)橹?少量更新,表鎖可能是更合適的選擇,這篇文章主要介紹了Mysql進(jìn)行操作時(shí)鎖的具體行為,需要的朋友可以參考下2025-09-09
關(guān)于com.mysql.jdbc.Driver與com.mysql.cj.jdbc.Driver的區(qū)別
這篇文章主要介紹了關(guān)于com.mysql.jdbc.Driver與com.mysql.cj.jdbc.Driver的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
KingbaseES中的MySQL案例實(shí)戰(zhàn)講解
本文將通過KingbaseES來創(chuàng)建一個(gè)視圖,帶你體驗(yàn)先進(jìn)的kesonline帶來的新式學(xué)習(xí)方式,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-07-07

