Innodb和Myisam是Mysql常見的兩種數據存儲引擎。沒有研究過Oracle、SQL Server等數據庫,因此下面只針對Mysql。mysql
1、兩種方式的數據存儲結構:sql
在Myisam下,數據庫的每一個數據表都有*.frm、*.YMI和*.YMD三個文件,其中*.frm存儲數據表的表結構,*.MYI存儲數據表的索引,*.MYD存數數據表的記錄數據;數據庫
在Innodb下,每一個數據庫下的每一個數據表只有一個*.frm存儲數據表的表結構,而全部數據庫的全部表數據索引、數據記錄都所有存儲在ibdata1文件中,而ib_logfile0和ib_logfile1是日誌文件。併發
2、數據導入和恢復:工具
Case1 Myisam =》 Myisam:性能
因爲Myisam的數據表結構、索引、記錄數據等信息分別存儲在*.frm、*.MYI和*.MYD文件中,因此只須要將源數據庫數據表的相應三個文件複製到對應目的數據庫文件夾下就能夠了。測試
可是若是隻有*.frm(假設test.frm)了,那麼能夠將test.frm複製到對應的數據庫目錄(假設tmp數據庫)以後,在tmp目錄下,新建test.MYI和test.MYD文件。此時經過「show tables;」能夠看到有test表,可是查看錶的數據,如「desc test;」,此時報錯沒法查看,由於只有test.frm有數據,而test.MYI和test.MYD是新建的無效文件。而後能夠經過Mysql自帶修復操做「REPAIRTABLE test USE_FRM」修復數據表,而後就能夠查看錶的數據,可是爲空(由於test.frm中不包含數據)。.net
Case2 Innodb =》 Innodb:日誌
因爲Innodb下,表結構存在*.frm文件,可是表的數據存儲在ibdata1文件中,因此導入時,除了複製*.frm,還要複製源Mysql的data目錄下的ibdata1,替換掉目的數據庫的ibdata,若是目的數據庫中有已存在的其餘數據庫,此時須要先備份目的數據庫的原先data數據,而後將新導入的表格經過其餘方式導出,而後在還原原先的data數據,將新導出的數據導入。blog
若是隻有*.frm(假設test.frm),沒有有效的ibdata1,那麼也只能恢復表的結構。先將test.frm複製到另外一個數據庫中(假設tmp),而後在tmp下新建一個Innodb型的數據表test(有哪些字段不重要),不要添加任何記錄。而後將要恢復的test.frm複製到test目錄下替代新建test表產生的test.frm,重啓mysql以後,新建的test表的結構就和要恢復的test表結構相同
Case3 Myisam =》 Innodb 和 Innodb =》 Myisam:
若是有*.frm、*.MYI和*.MYD三個文件,能夠經過Case1的方法導入以後,從新導出sql或者其餘文件,也能夠導入後修改成Innodb,以後經過Case2方式。一樣Innodb =》 Myisam的操做相似。
對於數據庫的數據,除了從.frm文件恢復以外,若是有日誌文件,從日誌文件恢復也是一個一個選擇。可是對於數據庫,進行移植或這更換系統時,最好仍是經過導入導出工具處處相應的sql語句文件。
3、Innodb和Myisam其餘區別:
一、Myisam多個數據庫和數據表的記錄數據是分文件存儲的,而Innodb全部表的記錄數據都存儲在ibdata1文件中,因此當數據表記錄比較少,單個表的數據文件比較少時,此時使用Myisam性能會略好於Innodb。可是若是表的數據記錄很是多,此時使用Innodb的性能會遠遠高於Myisam,經過測試能夠發現,隨着表的記錄增長,Innodb的性能下降不多,而Myisam的性能則迅速下降。
二、Innodb支持事務操做,而Myisam不支持事務操做。
事務操做:就是一組多條sql指令做爲一個總體,能夠併發操做,可是關鍵點在於事務內的多個操做必須同時執行完纔會提交結果。因此事務內的SQL要麼都不作,要麼都作。
事務實現通常有下面兩種方式:
Way1 begin、rollback和commit:
begin表示開始事務,rollback表示事務回滾,commit表示事務提交。
Way2 經過set來改變Mysql默認的自動提交模式:
set autocommit=0 禁止自動提交(使用事務,此時每條SQL都會看成事務,必須顯示使用commit體提交結果或者rollback撤銷結果)
set autocommit=1 開啓自動提交(禁用事務)
例子:參考這裏