MyISAM 引擎和Innodb 引擎的底層實現

2021-10-11 09:27:34 字數 1405 閱讀 4336

1.innodb 引擎的底層實現(聚集索引方式)

innodb 是聚集索引方式,因此資料和索引都儲存在同乙個檔案裡。首先 innodb 會根據主鍵 id 作為 key 建立索引 b+樹,如左下圖所示,而 b+樹的葉子節點儲存的是主鍵 id 對應的資料,比如在執行 select * from user_info where id=15 這個語句時,innodb 就會查詢這顆主鍵 id 索引 b+樹,找到對應的 user_name=『bob』。

這是建表的時候 innodb 就會自動建立好主鍵 id 索引樹,這也是為什麼 mysql 在建表時要求必須指定主鍵的原因。當我們為表裡某個欄位加索引時 innodb 會怎麼建立索引樹呢?比如我們要給 user_name 這個欄位加索引,那麼 innodb 就會建立 user_name 索引 b+樹,節點裡存的是 user_name 這個 key,葉子節點儲存的資料的是主鍵 key。注意,葉子儲存的是主鍵 key!拿到主鍵 key 後,innodb 才會去主鍵索引樹里根據剛在 user_name 索引樹找到的主鍵 key 查詢到對應的資料。

問題來了,為什麼 innodb 只在主鍵索引樹的葉子節點儲存了具體資料,但是其他索引樹卻不存具體資料呢,而要多此一舉先找到主鍵,再在主鍵索引樹找到對應的資料呢?

其實很簡單,因為 innodb 需要節省儲存空間。乙個表裡可能有很多個索引,innodb 都會給每個加了索引的字段生成索引樹,如果每個欄位的索引樹都儲存了具體資料,那麼這個表的索引資料檔案就變得非常巨大(資料極度冗餘了)。從節約磁碟空間的角度來說,真的沒有必要每個字段索引樹都存具體資料,通過這種看似「多此一舉」的步驟,在犧牲較少查詢的效能下節省了巨大的磁碟空間,這是非常有值得的。

2.myisam 引擎的底層實現(非聚集索引方式)

myisam 用的是非聚集索引方式,即資料和索引落在不同的兩個檔案上。myisam 在建表時以主鍵作為 key 來建立主索引 b+樹,樹的葉子節點存的是對應資料的實體地址。我們拿到這個實體地址後,就可以到 myisam 資料檔案中直接定位到具體的資料記錄了。

當我們為某個字段新增索引時,我們同樣會生成對應欄位的索引樹,該字段的索引樹的葉子節點同樣是記錄了對應資料的實體地址,然後也是拿著這個實體地址去資料檔案裡定位到具體的資料記錄。

總結:在進行 innodb 和 myisam 特點對比時談到,myisam 查詢效能更好,從上面索引檔案資料檔案的設計來看也可以看出原因:myisam 直接找到實體地址後就可以直接定位到資料記錄,但是 innodb 查詢到葉子節點後,還需要再查詢一次主鍵索引樹,才可以定位到具體資料。等於 myisam 一步就查到了資料,但是 innodb 要兩步,那當然 myisam 查詢效能更高。

Mysql引擎 Innodb和MyISAM的區別

本文是摘抄其他網文整理而成。create database engine innodb mysql 資料庫分為innodb和myisam兩類。兩者最主要的區別是 innodb支援事務處理 外來鍵和行級鎖.而myisam不支援,所以如果cud比較頻繁或要求事務一致性的,使用innodb比較好,反之使用...

InnoDB和MyISAM儲存引擎

mysql在檔案系統中將每個資料庫 也可以叫 schema 儲存為資料庫目錄下的乙個子目錄。建立表時,mysql會在資料庫子目錄下建立乙個和表同名的.frm檔案儲存表的定義。而 mysql會在資料庫子目錄下建立乙個和表同名的.frm檔案儲存表的定義。如 建立乙個名為a的表,mysql會在a.frm檔...

MyISAM和InnoDB引擎優化

一 公共選項 skip external locking 避免mysql的外部鎖定,減少出錯機率增強穩定性。skip name resolve 禁止mysql對外部連線進行dns解析,使用這一選項可以消除mysql進行dns解析的時間。但需要注意,如果開啟該選項,則所有遠端主機連線授權都要使用ip位...