MyISAM 和 InnoDB 作爲 MySQL 兩大常用的存儲引擎,經常在面試中被提及到。本文就來介紹一下它們之間的區別。 如果你想了解MySQL 存儲引擎相關內容,請跳轉鏈接:一文帶你看懂 MySQL 存儲引擎
區別:
1.InnoDB 支持事務,MyISAM 不支持。
對於InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin
和commit
之間,組成一個事務;
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文件
:保存的是索引內容】
如何選擇?
-
判斷是否需要支持事務,如果要請選擇
InnoDB
,如果不需要可以考慮MyISAM
; -
如果表中絕大多數都只是讀查詢,可以考慮
MyISAM
,如果既有讀也有寫,那還是使用InnoDB
吧。 -
系統奔潰後,MyISAM恢復起來更困難;
-
MySQL5.5 版本開始 InnoDB 已經成爲 MysQL 的默認引擎(之前是MyISAM),說明其優勢是有目共睹的,如果你不知道用什麼,那就用InnoDB,至少不會差。
Tip:如需詳細瞭解MySQL存儲引擎相關內容,請跳轉鏈接查看:一文帶你看懂 MySQL 存儲引擎
博主寫作不易,加個關注唄
求關注、求點贊,加個關注不迷路 ヾ(◍°∇°◍)ノ゙
博主不能保證寫的所有知識點都正確,但是能保證純手敲,錯誤也請指出,望輕噴 Thanks♪(・ω・)ノ