MyISAM 和 InnoDB 都是 MySQL 數據庫的數據庫引擎,其中 MyISAM 是 5.5 版本之前的默認引擎,而 5.5 版本之后,MySQL 引入了InnoDB 并且作為其默認的數據庫引擎。
01. 鎖MyISAM 只支持表級鎖(table-level locking),也就是任何 CRUD 的操作都會給表加上鎖,而 InnoDB 則支持表級鎖和行級鎖(row-level locking),默認是行級鎖。
Innodb 的行級鎖又分幾種:共享鎖(S),排它鎖(X),意向共享鎖(IS),意向排他鎖(IX);如果 SQL 語句沒有使用索引,并且又不能確定操作的行,這個時候就會鎖表;即使在查詢條件中使用了索引字段,但是如果 MySQL 認為全表掃描的效率更高,這時候也會使用表鎖,所以還是要通過執行計劃確認是否真正使用到了索引。
02. 事務MyISAM 強調的是性能,但是不支持事務;
Innodb 是支持事務的,事務級別包括未提交讀(Read uncommitted),已提交讀(Read committed),可重復讀(Repeatable read),可序列化(Serializable);
而不支持事務可能會導致:數據更新丟失、臟讀、不可重復讀等等;另外事務可以保障數據庫崩潰后的安全恢復。
03. 外鍵MyISAM 不支持外鍵,Innodb 支持外鍵。
04. 數據庫文件MyISAM 的數據庫文件屬于堆表,每個表在磁盤上都有三個文件,frm(存儲表定義)、myd(存儲表數據)、myi(存儲表索引);
InnoDB 分為表空間數據文件和日志文件;其中數據文件用于保存數據和索引,它又有兩種存儲方式,共享表空間存儲和多表空間存儲;如果是共享表空間,那么所有表的數據文件和索引文件都保存在同一個表空間中,如果是多表空間,那么每個表都有一個表空間文件,用于存儲數據和索引。
05. 索引MyISAM 使用非聚集索引,也就是索引和數據分開存儲,索引保存的是數據文件的指針;也就是說,主鍵索引和非主鍵索引的葉子節點都是數據文件的指針。
InnoDB 使用聚集索引,也就是索引和數據存在一個文件中;必須要有主鍵;不過如果使用非主鍵索引的話,需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到數據;也就是說,主鍵索引的葉子節點是數據文件,非主鍵索引的葉子節點是主鍵的值。
另外著重指出,InnoDB 必須有主鍵,MyISAM 可以沒有。
06. count()MyISAM 保存有表的總行數,如果使用 select count(*) from table,直接取出該值,效率更高;
InnoDB 沒有保存表的總行數,如果使用 select count(*) from table,需要遍歷整個表;
當然如果是加了 where 條件的話,兩種引擎都需要進行掃描。
我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。