首頁  >  文章  >  資料庫  >  淺析MySQL儲存引擎中的索引

淺析MySQL儲存引擎中的索引

青灯夜游
青灯夜游轉載
2021-10-29 19:23:421421瀏覽

這篇文章和大家聊聊MySQL儲存引擎中索引如何落地,希望對大家有幫助!

淺析MySQL儲存引擎中的索引

我們知道不同的儲存引擎檔案是不一樣,我們可以查看資料檔案目錄:

show VARIABLES LIKE 'datadir';

每張InnoDB 的表格有兩個檔案( .frm 和.ibd ),MyISAM 的表有三個檔案(.frm、.MYD、.MYI)。 【相關推薦:mysql影片教學

有一個是相同的文件,.frm .frm是 MySQL 裡面表結構定義的文件,不管你建表的時候選用任何一個儲存引擎都會生成,我們就不看了。

我們主要看一下其他兩個檔案是怎麼實作 MySQL 不同的儲存引擎的索引的。

我們先來看 MyISAM。

MyISAM

在MyISAM 裡面,另外有兩個文件:

一個是.MYD文件,D 代表Data ,是MyISAM 的資料文件,存放資料記錄,例如我們的user_myisam 表的所有的表格資料。

一個是.MYI 文件,I 代表Index,是MyISAM 的索引文件,存放索引,例如我們在id 欄位上面創建了一個主鍵索引,那麼主鍵索引就是在這個索引文件裡面。

也就是說,在 MyISAM 裡面,索引和資料是兩個獨立的檔案。那我們要怎麼根據索引找到資料呢?

MyISAM 的 B Tree 裡面,葉子節點儲存的是資料檔案對應的磁碟位址。所以從索引檔.MYI 中找到鍵值後,會到資料檔.MYD 中取得對應的資料記錄。

淺析MySQL儲存引擎中的索引

這裡畫的是主鍵索引,如果是輔助索引,有什麼不一樣呢?

在 MyISAM 裡面,輔助索引也在這個.MYI 檔案裡面。輔助索引跟主鍵索引儲存和檢索資料的方式是沒有任何差別的,一樣是在索引檔案裡面找到磁碟位址,然後到資料檔案裡面取得資料。

淺析MySQL儲存引擎中的索引

InnoDB

InnoDB 只有一個檔案(.ibd 檔案),那索引放在哪裡呢?

在 InnoDB 裡面,它是以主鍵為索引來組織資料的儲存的,所以索引檔案和資料檔案是同一個文件,都在.ibd 檔案裡面。

在 InnoDB 的主鍵索引的葉子節點上,它直接儲存了我們的資料。

淺析MySQL儲存引擎中的索引

什麼叫做聚集索引(叢集索引)?

就是索引鍵值的邏輯順序跟表格資料行的實體儲存順序是一致的。 (例如字典的目錄是按拼音排序的,內容也是按拼音排序的,按拼音排序的這種目錄就叫聚集索引)。

在 InnoDB 裡面,它組織資料的方式叫做叫做(聚集)索引組織表(clustered index organize table),所以主鍵索引是聚集索引,非主鍵都是非聚集索引。

主鍵之外的索引,例如我們在 name 欄位上面建立的普通索引,又是怎麼儲存和檢索資料的呢?

淺析MySQL儲存引擎中的索引

InnoDB 中,主鍵索引和輔助索引是有一個主次之分的。

輔助索引儲存的是輔助索引和主鍵值。如果使用輔助索引查詢,會根據主鍵值在主鍵索引中查詢,最終取得資料。

例如我們用 name 索引查詢 name= '青山',它會在葉子節點找到主鍵值,也就是 id=1,然後再到主鍵索引的葉子節點拿到資料。

另一個問題,如果一張表沒有主鍵怎麼辦?

1、如果我們定義了主鍵(PRIMARY KEY),那麼 InnoDB 會選擇主鍵作為聚集索引。

2、如果沒有明確定義主鍵,則 InnoDB 會選擇第一個不包含有 NULL 值的唯一索引作為主鍵索引。

3、如果也沒有這樣的唯一索引,則 InnoDB 會選擇內建 6 位元組長的 ROWID 作為隱藏的聚集索引,它會隨著行記錄的寫入而主鍵遞增。

select _rowid name from t2;

所以呢?不會存在沒有主鍵的表。

小結

透過上述的分析,我們知道在 MyISAM 和 InnoDB 這兩大儲存引擎中,索引的具體落地形式是怎麼樣的。

更多程式相關知識,請造訪:程式設計入門! !

以上是淺析MySQL儲存引擎中的索引的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除