這是高級開發者面試時經常被問的問題。實際我們在平時的開發中,經常會遇到的,在用SQLyog等工具創建表時,就有一個引擎項要你去選。如下圖: Mysql的存儲引擎有這麼多種,實際我們在平時用的最多的莫過於InnoDB和MyISAM了。 所有如果面試官問道mysql有哪些存儲引擎,你只需要告訴這兩個常用 ...
這是高級開發者面試時經常被問的問題。實際我們在平時的開發中,經常會遇到的,在用SQLyog等工具創建表時,就有一個引擎項要你去選。如下圖:
Mysql的存儲引擎有這麼多種,實際我們在平時用的最多的莫過於InnoDB和MyISAM了。
所有如果面試官問道mysql有哪些存儲引擎,你只需要告訴這兩個常用的就行。
那他們都有什麼特點和區別呢?
MyISAM和InnoDB的特點:
MyISAM :預設表類型,它是基於傳統的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲記錄和文件的標準方法。不是事務安全的,而且不支持外鍵,如果執行大量的select,insert MyISAM比較適合。
InnoDB :支持事務安全的引擎,支持外鍵、行鎖、事務是他的最大特點。如果有大量的update和insert,建議使用InnoDB,特別是針對多個併發和QPS較高的情況。註: 在MySQL 5.5之前的版本中,預設的搜索引擎是MyISAM,從MySQL 5.5之後的版本中,預設的搜索引擎變更為InnoDB。
MyISAM和InnoDB的區別:
- InnoDB支持事務,MyISAM不支持。對於InnoDB每一條SQL語言都預設封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務;
- InnoDB支持外鍵,而MyISAM不支持。
- InnoDB是聚集索引,使用B+Tree作為索引結構,數據文件是和(主鍵)索引綁在一起的(表數據文件本身就是按B+Tree組織的一個索引結構),必須要有主鍵,通過主鍵索引效率很高。MyISAM是非聚集索引,也是使用B+Tree作為索引結構,索引和數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。
- InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變數保存了整個表的行數,執行上述語句時只需要讀出該變數即可,速度很快。
- Innodb不支持全文索引,而MyISAM支持全文索引,查詢效率上MyISAM要高;5.7以後的InnoDB支持全文索引了。
- InnoDB支持表、行級鎖(預設),而MyISAM支持表級鎖。
- InnoDB表必須有主鍵(用戶沒有指定的話會自己找或生產一個主鍵),而Myisam可以沒有。
- Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI。
Innodb:frm是表定義文件,ibd是數據文件。
Myisam:frm是表定義文件,myd是數據文件,myi是索引文件。
最後:
本次分享就到這裡,相信通過上面的文章,你已經對InnoDB和MyISAM有一個基本的認識了,但是你僅僅知道這一些是不夠的,在接下來的一段時間里,我會繼續在我的公眾號:Java技術zhai 總結一些面試中的問題共用給大家。