MyISAM與InnoDB索引實(shí)現(xiàn)對(duì)比詳解
MyISAM索引實(shí)現(xiàn)
MyISAM引擎使用B+Tree作為索引結(jié)構(gòu),葉節(jié)點(diǎn)的data域存放的是數(shù)據(jù)記錄的地址。如圖:
這里設(shè)表一共有三列,假設(shè)我們以Col1為主鍵,則上圖是一個(gè)MyISAM表的主索引(Primary key)示意??梢钥闯鯩yISAM的索引文件僅僅保存數(shù)據(jù)記錄的地址。在MyISAM中,主索引和輔助索引(Secondary key)在結(jié)構(gòu)上沒(méi)有任何區(qū)別,只是主索引要求key是唯一的,而輔助索引的key可以重復(fù)。如果我們?cè)贑ol2上建立一個(gè)輔助索引,則此索引的結(jié)構(gòu)如下圖所示:
同樣也是一顆B+Tree,data域保存數(shù)據(jù)記錄的地址。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。
MyISAM的索引方式也叫做“非聚集”的,之所以這么稱(chēng)呼是為了與InnoDB的聚集索引區(qū)分。
InnoDB索引實(shí)現(xiàn)
雖然InnoDB也使用B+Tree作為索引結(jié)構(gòu),但具體實(shí)現(xiàn)方式卻與MyISAM截然不同。
第一個(gè)重大區(qū)別是InnoDB的數(shù)據(jù)文件本身就是索引文件。從上文知道,MyISAM索引文件和數(shù)據(jù)文件是分離的,索引文件僅保存數(shù)據(jù)記錄的地址。而在InnoDB中,表數(shù)據(jù)文件本身就是按B+Tree組織的一個(gè)索引結(jié)構(gòu),這棵樹(shù)的葉節(jié)點(diǎn)data域保存了完整的數(shù)據(jù)記錄。這個(gè)索引的key是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。
上圖是InnoDB主索引(同時(shí)也是數(shù)據(jù)文件)的示意圖,可以看到葉節(jié)點(diǎn)包含了完整的數(shù)據(jù)記錄。這種索引叫做聚集索引。因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒(méi)有),如果沒(méi)有顯式指定,則MySQL系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類(lèi)型為長(zhǎng)整形。
第二個(gè)與MyISAM索引的不同是InnoDB的輔助索引data域存儲(chǔ)相應(yīng)記錄主鍵的值而不是地址。換句話(huà)說(shuō),InnoDB的所有輔助索引都引用主鍵作為data域。例如,下圖為定義在Col3上的一個(gè)輔助索引:
這里以英文字符的ASCII碼作為比較準(zhǔn)則。聚集索引這種實(shí)現(xiàn)方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。
總結(jié)
在數(shù)據(jù)庫(kù)開(kāi)發(fā)中,了解不同存儲(chǔ)引擎的索引實(shí)現(xiàn)方式對(duì)于正確使用和優(yōu)化索引都非常有幫助。例如,知道了InnoDB的索引實(shí)現(xiàn)后,就很容易明白為什么不建議使用過(guò)長(zhǎng)的字段作為主鍵,因?yàn)樗休o助索引都引用主索引,過(guò)長(zhǎng)的主索引會(huì)令輔助索引變得過(guò)大。再例如,用非單調(diào)的字段作為主鍵在InnoDB中不是個(gè)好做法,因?yàn)镮nnoDB數(shù)據(jù)文件本身是一顆B+Tree,非單調(diào)的主鍵會(huì)造成在插入新記錄時(shí)數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整,十分低效,而使用自增字段作為主鍵則是一個(gè)很好的選擇。
到此這篇關(guān)于MyISAM與InnoDB索引實(shí)現(xiàn)對(duì)比的文章就介紹到這了,更多相關(guān)MyISAM與InnoDB索引對(duì)比內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql更改引擎(InnoDB,MyISAM)的方法
- MySQL存儲(chǔ)引擎中的MyISAM和InnoDB區(qū)別詳解
- 淺談MySQL存儲(chǔ)引擎選擇 InnoDB與MyISAM的優(yōu)缺點(diǎn)分析
- MySQL數(shù)據(jù)庫(kù)修復(fù)方法(MyISAM/InnoDB)
- MySQL存儲(chǔ)引擎MyISAM與InnoDB區(qū)別總結(jié)整理
- 將MySQL從MyISAM轉(zhuǎn)換成InnoDB錯(cuò)誤和解決辦法
- MySQL存儲(chǔ)引擎 InnoDB與MyISAM的區(qū)別
- MySQL兩種表存儲(chǔ)結(jié)構(gòu)MyISAM和InnoDB的性能比較測(cè)試
- MySQL從MyISAM轉(zhuǎn)換成InnoDB錯(cuò)誤與常用解決辦法
- mysql中engine=innodb和engine=myisam的區(qū)別介紹
相關(guān)文章
SQL行轉(zhuǎn)列、列轉(zhuǎn)行的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于SQL行轉(zhuǎn)列、列轉(zhuǎn)行的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05如何查看Navicat加密的數(shù)據(jù)庫(kù)密碼
本機(jī)裝的MySQL數(shù)據(jù)庫(kù)密碼忘記了,打開(kāi)了Navicat連接過(guò)數(shù)據(jù)庫(kù),不過(guò)密碼是加密的,怎么辦呢?今天小編給大家分享如何查看Navicat加密的數(shù)據(jù)庫(kù)密碼,感興趣的朋友一起看看吧2023-04-04數(shù)據(jù)庫(kù)的設(shè)計(jì)方法、規(guī)范與技巧
數(shù)據(jù)庫(kù)的設(shè)計(jì)方法、規(guī)范與技巧...2007-03-03數(shù)據(jù)庫(kù)系統(tǒng)結(jié)構(gòu)詳解之三級(jí)模式結(jié)構(gòu)
這篇文章主要為大家介紹了數(shù)據(jù)庫(kù)系統(tǒng)的結(jié)構(gòu),文中通過(guò)圖文的方式詳細(xì)的解析了數(shù)據(jù)庫(kù)系統(tǒng)結(jié)構(gòu)的三級(jí)模式結(jié)構(gòu),有需要的朋友可以借鑒參考下2021-09-09victoriaMetrics代理性能優(yōu)化問(wèn)題解析
這篇文章主要為大家介紹了victoriaMetrics代理性能優(yōu)化問(wèn)題的解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04Maven nexus 安裝nexus私服出現(xiàn)的問(wèn)題和解決辦法
本文主要介紹安裝nexus私服的時(shí)候出現(xiàn)問(wèn)題的解決辦法,這里整理了兩種問(wèn)題并詳細(xì)說(shuō)明了解決辦法,有需要的朋友可以參考下2016-08-08解決navicat遠(yuǎn)程連接mysql報(bào)錯(cuò)10038的問(wèn)題
這篇文章主要介紹了解決navicat遠(yuǎn)程連接mysql報(bào)錯(cuò)10038的問(wèn)題,本文分步驟通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11