還不瞭解 MyISAM 和 InnoDB 的區別?看這裏就夠了

  MyISAM 和 InnoDB 作爲 MySQL 兩大常用的存儲引擎,經常在面試中被提及到。本文就來介紹一下它們之間的區別。 如果你想了解MySQL 存儲引擎相關內容,請跳轉鏈接:一文帶你看懂 MySQL 存儲引擎

區別:

  1.InnoDB 支持事務,MyISAM 不支持。對於InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begincommit之間,組成一個事務;

  2. InnoDB 支持外鍵,而 MyISAM 不支持。對一個包含外鍵的InnoDB錶轉爲MYISAM會失敗; (外鍵現在用的也不多,因爲它關聯性太強,如果要刪除一個表,會因爲有外鍵的關聯而導致刪除失敗。通常是通過 table a = table b on a.id = b.id 這種兩表關聯的方式來間接替代外鍵作用 )

  3.InnoDB是聚集索引,使用B+Tree作爲索引結構,數據文件是和(主鍵)索引綁在一起的;MyISAM是非聚集索引,它也是使用B+Tree作爲索引結構,但是索引和數據文件是分離的,索引保存的是數據文件的指針
在這裏插入圖片描述
在這裏插入圖片描述
  4.InnoDB 必須要有主鍵,MyISAM可以沒有主鍵InnoDB 如果我們沒有明確去指定創建主鍵索引。它會幫我們隱藏的生成一個 6 byte 的 int 型的索引作爲主鍵索引。

  5.InnoDB輔助索引和主鍵索引之間存在層級關係;MyISAM輔助索引和主鍵索引則是平級關係。即:InnoDB 如果添加其他輔助索引,輔助索引查詢就需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到數據。因此,主鍵不應該過大,因爲主鍵太大,其他索引也相應都會很大。(比如表中有id(主鍵),name,age 字段,我們創建一個主鍵索引,再來創建一個name索引,層級關係如下圖所示)
在這裏插入圖片描述
在這裏插入圖片描述
  6. InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快(注意不能加有任何WHERE條件);

  7. Innodb不支持全文索引,而MyISAM支持全文索引,在全文索引領域的查詢效率上MyISAM速度更快高;(MySQL 5.7 版本以後,InnoDB也支持全文索引了)

  8. InnoDB支持表級鎖、行級鎖,默認爲行級鎖;而 MyISAM 僅支持表級鎖。InnoDB 的行鎖是實現在索引上的,而不是鎖在物理行上。即:如果訪問命中索引,也無法使用行鎖,將要退化爲表鎖

  9. Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI。【InnoDB 中,.frm文件:保存的是表結構定義描述文件;.ibd文件:保存的是employee表中的數據內容】;【MyISAM中,.frm文件:保存的是表結構定義描述文件,.MYD文件:保存的是數據內容,.MYI文件:保存的是索引內容】

在這裏插入圖片描述
在這裏插入圖片描述

如何選擇?

  1. 判斷是否需要支持事務,如果要請選擇 InnoDB,如果不需要可以考慮MyISAM

  2. 如果表中絕大多數都只是讀查詢,可以考慮 MyISAM,如果既有讀也有寫,那還是使用InnoDB吧。

  3. 系統奔潰後,MyISAM恢復起來更困難;

  4. MySQL5.5 版本開始 InnoDB 已經成爲 MysQL 的默認引擎(之前是MyISAM),說明其優勢是有目共睹的,如果你不知道用什麼,那就用InnoDB,至少不會差。

Tip:如需詳細瞭解MySQL存儲引擎相關內容,請跳轉鏈接查看:一文帶你看懂 MySQL 存儲引擎


博主寫作不易,加個關注唄

求關注、求點贊,加個關注不迷路 ヾ(◍°∇°◍)ノ゙

博主不能保證寫的所有知識點都正確,但是能保證純手敲,錯誤也請指出,望輕噴 Thanks♪(・ω・)ノ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章