Mysql有兩大經常使用的存儲引擎MyISAM,InnoDB,默認的形式是前者。 二者基本的差異是對事務處理、外鍵和行級鎖的主持上,InnoDB支持事務處理、外鍵等高級特性,而MyISAM不支持。MyISAM類型的表強調的是性能,若是執行大量的select操做,MyISAM是更好的選擇,其執行數度比InnoDB類型更快。 二者具體的差異以下: 1.MyISAM的索引和文件自己是分開的,這一點在存儲上能看出來:每一個MyISAM在磁盤上存儲成三個文件:文件的名字以表的名字開始,擴展名指出文件類型。 .frm文件存儲表定義;數據文件:擴展名爲.MYD (MYData);索引文件:擴展名是.MYI (MYIndex)。 2.在事務處理方面:MyISAM不支持事務處理,並且不支持外鍵(foreign key),而InnoDB支持。 例如:create table table2( id char(1) not null, foreign key(id) references table1(id) );//table1已經創建 這裏默認使MyISAM的存儲引擎,show create table2一下,則會出現: CREATE TABLE `table2` ( `id` char(1) NOT NULL, KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 可見,table2並無創建外鍵。 3.InnoDB不支持fulltext類型的索引; 4.若是執行大量的SELECT,MyISAM是更好的選擇,若是執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表; 5.delete from table時,InnoDB不會從新創建表,而是一行一行的刪除; 6.LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用; 7.對AUTO_INCREMENT字段的操做:對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引; 8.InnoDB中不保存表的具體行數,而MyISAM是保存的,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。當count(*)語句包含where條件時例外,兩種表的操做是同樣的(這很好理解,由於存儲的行數不能利用了)。 9.對鎖的支持:InnoDB提供行鎖(和Oracle相似),而MyISAM則在整個表上加鎖。