MySQL支持很多存儲引擎,包括MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDBCluster、ARCHIVE等,其中InnoDB和BDB支持事務安全。它還支持一些第三方的存儲引擎,例如TokuDB(高寫性能高壓縮存儲引擎)、Infobright(列式存儲引擎)。
Mysql中 MyISAM和 InnoDB的區別有哪些?
區別:
1. InnoDB支持事務,MyISAM不支持事務。這是 MySQL 將默認存儲引擎從 MyISAM變成 InnoDB的重要原因之一;
2. InnoDB支持外鍵,而 MyISAM不支持。對一個包含外鍵的 InnoDB錶轉為 MYISAM會失敗;
3. InnoDB是聚集索引,MyISAM是非聚集索引。聚簇索引的文件存放在主鍵索引的葉子節點上,因此 InnoDB必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到數據。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。而MyISAM是非聚集索引,數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。
4. InnoDB不保存表的具體行數,執行 selectcount(*) from table 時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快;
5. InnoDB最小的鎖粒度是行鎖,MyISAM最小的鎖粒度是表鎖。一個更新語句會鎖住整張表,導致其他查詢和更新都會被阻塞,因此並發訪問受限。這也是MySQL將默認存儲引擎從MyISAM變成 InnoDB的重要原因之一;
如何選擇:
1. 是否要支持事務,如果要請選擇 InnoDB,如果不需要可以考慮MyISAM;
2. 如果表中絕大多數都只是讀查詢,可以考慮 MyISAM,如果既有讀寫也挺頻繁,請使用InnoDB。
3. 系統奔潰後,MyISAM恢復起來更困難,能否接受,不能接受就選 InnoDB;
4. MySQL5.5版本開始Innodb已經成為Mysql的默認引擎(之前是MyISAM),說明其優勢是有目共睹的。如果你不知道用什麼存儲引擎,那就用InnoDB,至少不會差。
Innodb引擎概述
Innodb引擎提供了對資料庫ACID事務的支持,並且實現了SQL標準的四種隔離級別。該引擎還提供了行級鎖和外鍵約束,它的設計目標是處理大容量資料庫系統,它本身其實就是基於MySQL後臺的完整資料庫系統,MySQL運行時Innodb會在內存中建立緩衝池,用於緩衝數據和索引。但是該引擎不支持FULLTEXT類型的索引,而且它沒有保存表的行數,當SELECTCOUNT(*) FROM TABLE時需要掃描全表。當需要使用資料庫事務時,該引擎當然是首選。由於鎖的粒度更小,寫操作不會鎖定全表,所以在並發較高時,使用Innodb引擎會提升效率。但是使用行級鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表。
MyISAM引擎概述
MyISAM是MySQL默認的引擎,但是它沒有提供對資料庫事務的支持,也不支持行級鎖和外鍵,因此當INSERT(插入)或UPDATE(更新)數據時即寫操作需要鎖定整個表,效率便會低一些。不過和Innodb不同,MyISAM中存儲了表的行數,於是SELECTCOUNT(*) FROM TABLE時只需要直接讀取已經保存好的值而不需要進行全表掃描。如果表的讀操作遠遠多於寫操作且不需要資料庫事務的支持,那麼MyISAM也是很好的選擇。
簡單介紹區別
1、MyISAM是非事務安全的,而InnoDB是事務安全的
2、MyISAM鎖的粒度是表級的,而InnoDB支持行級鎖
3、MyISAM支持全文類型索引,而InnoDB不支持全文索引
4、MyISAM相對簡單,效率上要優於InnoDB,小型應用可以考慮使用MyISAM
5、MyISAM表保存成文件形式,跨平臺使用更加方便
應用場景
1、MyISAM管理非事務表,提供高速存儲和檢索以及全文搜索能力,如果再應用中執行大量select操作應該選擇MyISAM
2、InnoDB用於事務處理,具有ACID事務支持等特性,如果在應用中執行大量insert和update操作,應該選擇InnoDB
mysql中指定引擎的方法:
1、創建表時,可以通過ENGINE來指定存儲引擎,在create語句最後加上「engine=存儲引擎;」即可;
2、修改表時,可以使用「alter table 表名 engine=存儲引擎;」來指定存儲引擎。
查看當前表使用的存儲引擎mysql> show create table emp;或者mysql> show table status like 'emp' \G;
查看當前資料庫支持的存儲引擎mysql> show engines \G;