歡迎關(guān)注專欄:后端架構(gòu)技術(shù)精選。里面有大量關(guān)于的Java高級架構(gòu)知識點分享,還有各種面試趣聞以及程序員身邊事,如有好文章也歡迎投稿哦。

這是高級開發(fā)者面試時經(jīng)常被問的問題。
實際我們在平時的開發(fā)中,經(jīng)常會遇到的,在用SQLyog等工具創(chuàng)建表時,就有一個引擎項要你去選。如下圖:

Mysql的存儲引擎有這么多種,實際我們在平時用的最多的莫過于InnoDB和MyISAM了。
所有如果面試官問道m(xù)ysql有哪些存儲引擎,你只需要告訴這兩個常用的就行。
那他們都有什么特點和區(qū)別呢?
MyISAM和InnoDB的特點:
MyISAM :默認(rèn)表類型,它是基于傳統(tǒng)的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲記錄和文件的標(biāo)準(zhǔn)方法。不是事務(wù)安全的,而且不支持外鍵,如果執(zhí)行大量的select,insert MyISAM比較適合。
InnoDB :支持事務(wù)安全的引擎,支持外鍵、行鎖、事務(wù)是他的最大特點。如果有大量的update和insert,建議使用InnoDB,特別是針對多個并發(fā)和QPS較高的情況。注: 在MySQL 5.5之前的版本中,默認(rèn)的搜索引擎是MyISAM,從MySQL 5.5之后的版本中,默認(rèn)的搜索引擎變更為InnoDB。
MyISAM和InnoDB的區(qū)別:
- InnoDB支持事務(wù),MyISAM不支持。對于InnoDB每一條SQL語言都默認(rèn)封裝成事務(wù),自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務(wù);
- InnoDB支持外鍵,而MyISAM不支持。
- InnoDB是聚集索引,使用B+Tree作為索引結(jié)構(gòu),數(shù)據(jù)文件是和(主鍵)索引綁在一起的(表數(shù)據(jù)文件本身就是按B+Tree組織的一個索引結(jié)構(gòu)),必須要有主鍵,通過主鍵索引效率很高。MyISAM是非聚集索引,也是使用B+Tree作為索引結(jié)構(gòu),索引和數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨立的。
- InnoDB不保存表的具體行數(shù),執(zhí)行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數(shù),執(zhí)行上述語句時只需要讀出該變量即可,速度很快。
- Innodb不支持全文索引,而MyISAM支持全文索引,查詢效率上MyISAM要高;5.7以后的InnoDB支持全文索引了。
- InnoDB支持表、行級鎖(默認(rèn)),而MyISAM支持表級鎖。
- InnoDB表必須有主鍵(用戶沒有指定的話會自己找或生產(chǎn)一個主鍵),而Myisam可以沒有。
- Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI。
Innodb:frm是表定義文件,ibd是數(shù)據(jù)文件。
Myisam:frm是表定義文件,myd是數(shù)據(jù)文件,myi是索引文件。
最后:
本次分享就到這里,相信通過上面的文章,你已經(jīng)對InnoDB和MyISAM有一個基本的認(rèn)識了,但是你僅僅知道這一些是不夠的,在接下來的一段時間里,我會繼續(xù)在我的專欄:后端架構(gòu)技術(shù)精選里面總結(jié)一些面試中的問題共享給大家。