對於這兩種存儲引擎的選擇,要根據項目的應用特點來權衡,而對於復雜的應用系統,也可以根據實際情況來選擇多種存儲引擎的組合。不過這種方法不建議采取。
MyISAM支持全文索引,這是一種基於分詞創建的索引,支持一些比較復雜的查詢,但不是事務安全的,而且不支持外鍵。每張MyISAM表存放在3個文件中:frm文件存放表格定義;數據文件是MYD;索引文件是MYI;對於MyISAM表,可以手工或者自動執行檢查或修復操作。
InnoDB是事務型引擎,支持回滾,具有崩潰恢復能力,多版本並發控制,支持ACID事務、支持行級鎖定(InnoDB的行級鎖不是絕對的,如果一個SQL語句沒有使用到索引,那麼InnoDB會鎖全表)。
InnoDB的工作原理:就是把數據撈帶內存當中,被用戶讀寫,這樣大大增加了性能。當數據全部加載到內存當中時,這時的性能是最好的,它的設計理論是充分利用內存,減少磁盤I/O使用率。
MyISAM和InnoDB的區別有以下幾點:
1.MyISAM是非事務安全型的,而InnoDB是事務安全型的,也就是ACID事務支持。
2.MyISAM鎖是表級鎖,鎖開銷小,而InnoDB支持行級鎖定,鎖管理開銷大,支持更好的並發寫操作。
3.在最新的版本中,兩者都已經支持全文索引。
4.MyISAM相對簡單,管理方便,因此在效率上優先於InnoDB,小型應用可以考慮使用。
5.MyISAM表是保存成文件的形式,在跨平台的數據轉移中使用其存儲會省去不少的麻煩。
6.InnoDB表比MyISAM表更安全,可以保證在數據不丟失的情況下切換非事務表到事務表。
總結:
MyISAM存儲引擎的讀鎖和寫鎖是互斥的,讀寫操作時串行的。當一個進程請求某個MyISAM表的讀鎖,同時另一個進程也請求通一表的寫鎖,MySQL是寫進程先獲得鎖,不僅如此,即使讀請求先到鎖等待隊列,寫請求後到,寫鎖也會插到讀鎖請求之前,這是因為MySQL會認為寫請求一般要比讀請求重要,這也是MyISAM表不太適合有大量更新操作和查詢操作應用的原因,因為大量的更新操作會造成查詢操作很難忽地讀鎖,從而可能永遠阻塞。
InnoDB用於事務處理應用程序,具有眾多特性,包括支持ACID事務、行鎖等。如果應用中需要執行大量的讀寫操作,則應使用InnoDB,這樣可以提高多用戶並發操作的性能,所以要盡量優先使用InnoDB引擎。