MyISAM:
- 不支持事務,並且也不支持外鍵,可是每次查詢都是原子的
- 支持表級鎖,即每次操做是對整個表加鎖
- 一個MYISAM表有三個文件:索引文件、表結構文件(.frm文件)、數據文件(.MYD文件)
- 採用非彙集索引,索引文件的數據域存儲指向數據文件的指針。輔索引與主索引基本一致,可是輔索引不用保證惟一性
優勢:查詢數據相對較快,適合大量的select,能夠全文索引。
缺點:不支持事務,不支持外鍵,併發量較小,不適合大量updatesql
InnoDb:
- 支持ACID的事務,支持事務的四種隔離級別;
- 支持行級鎖及外鍵約束:所以能夠支持寫併發;
- 不存儲總行數;
- 一個InnoDb引擎存儲在一個文件空間(共享表空間,表大小不受操做系統控制,一個表可能分佈在多個文件裏),也有可能爲多個(設置爲獨立表空,表大小受操做系統文件大小限制,通常爲2G),受操做系統文件大小的限制;
- 主鍵索引採用彙集索引(索引的數據域存儲數據文件自己),輔索引的數據域存儲主鍵的值;所以從輔索引查找數據,須要先經過輔索引找到主鍵值,再訪問輔索引;最好使用自增主鍵,防止插入數據時,爲維持B+樹結構,文件的大調整。
優勢:支持事務,支持外鍵,併發量較大,適合大量update
缺點:查詢數據相對較快,不適合大量的select數據庫
MyISAM與InnoDB的比較
基本的差異爲:
MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。
MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,可是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。緩存
兩種存儲引擎的大體區別表如今:安全
- 1)InnoDB支持事務,MyISAM不支持。
- 2)InnoDB支持外鍵,MyISAM不支持.
- 3)從MySQL5.5.5之後,InnoDB是默認引擎.
- 4)從MySQL5.6版本開始,InnoDB開始支持FULLTEXT類型的索引.以前的版本不支持全文索引。
- 5)InnoDB中不保存表的行數,如
select count(0) from table
時,InnoDB須要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(0)語句包含where條件時MyISAM也須要掃描整個表.
- 6)對於自增加的字段,在MyISAM表中能夠和其餘字段一塊兒創建聯合索引.在InnoDB中,能夠建立只有該字段的索引,也能夠創建聯合索引,但自增鍵必須在最左側
- 7)清空整個表(
delete from
)時,InnoDB是一行一行的刪除,效率很是慢。MyISAM則會重建表. (這個區別貌似不是很重要哈)
- 8)InnoDB支持行鎖(某些狀況下仍是鎖整表,如
update table set a=1 where user like '%lee%'
.
- 9)MyISAM的索引和數據是分開的,而且索引是有壓縮的,內存使用率就對應提升了很多。能加載更多索引,而Innodb是索引和數據是緊密捆綁的,沒有使用壓縮從而會形成Innodb比MyISAM體積龐大不小.
- 10)MyISAM緩存在內存的是索引,不是數據。而InnoDB緩存在內存的是數據,相對來講,服務器內存越大,InnoDB發揮的優點越大。
關於MyISAM與InnoDB選擇:
MYISAM和INNODB是Mysql數據庫提供的兩種存儲引擎。二者的優劣可謂是各有千秋。INNODB會支持一些關係數據庫的高級功能,如事務功能和行級鎖,MYISAM不支持。MYISAM的性能更優,佔用的存儲空間少。因此,選擇何種存儲引擎,視具體應用而定:服務器
- 1)若是你的應用程序必定要使用事務,毫無疑問你要選擇INNODB引擎。但要注意,INNODB的行級鎖是有條件的。在where條件沒有使用主鍵時,照樣會鎖全表。好比
DELETE FROM mytable
這樣的刪除語句。
- 2)若是你的應用程序對查詢性能要求較高,就要使用MYISAM了。MYISAM索引和數據是分開的,並且其索引是壓縮的,能夠更好地利用內存。因此它的查詢性能明顯優於INNODB。壓縮後的索引也能節約一些磁盤空間。MYISAM擁有全文索引的功能,這能夠極大地優化LIKE查詢的效率。
- 3)MyISAM適合查詢以及插入爲主的應用,InnoDB適合頻繁修改以及涉及到安全性較高的應用。