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

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

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

可以看到對于非聚簇索引,不管是以主鍵為排序規(guī)則還是以非主鍵為排序規(guī)則,它的結構都是相同的,即葉子節(jié)點存放的都是相應的列+行號。
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
mysql死鎖(dead lock)與鎖等待(lock wait)的出現(xiàn)解決
死鎖和鎖等待是數(shù)據(jù)庫運維中常見的問題,區(qū)別在于死鎖會自動解除,而鎖等待需要手動處理,本文就來介紹一下mysql死鎖(dead lock)與鎖等待(lock wait),感興趣的可以了解一下2024-09-09
解決MySQL server has gone away錯誤的方案
在本篇文章里小編給大家分享的是一篇關于MySQL server has gone away錯誤的解決辦法,有需要的朋友們可以參考下。2020-02-02
mysql遞歸函數(shù)with?recursive的用法舉例
在實際開發(fā)的過程中,我們會遇到一些數(shù)據(jù)是層級關系的、要展示數(shù)據(jù)子父級關系的時候,下面這篇文章主要給大家介紹了關于mysql遞歸函數(shù)with?recursive的用法舉例,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08
MySQL實現(xiàn)字符串的拼接,截取,替換,查找位置的操作
這篇文章主要介紹了MySQL實現(xiàn)字符串的拼接,截取,替換,查找位置的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Mysql查詢數(shù)據(jù)庫連接狀態(tài)以及連接信息詳解
這篇文章主要給大家介紹了關于Mysql查詢數(shù)據(jù)庫連接狀態(tài)以及連接信息的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-04-04
MySQL數(shù)據(jù)庫中CAST與CONVERT函數(shù)實現(xiàn)類型轉換的講解
今天小編就為大家分享一篇關于MySQL數(shù)據(jù)庫中CAST與CONVERT函數(shù)實現(xiàn)類型轉換的講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03

