MySQLInnoDBDialect和MySQLMyISAMDialect的差異(轉)數據庫
(注:MySQLInnoDBDialect與MySQLMyISAMDialect繼承自MySQLDialect。)緩存
InnoDB和MyISAM是MySQL最重要的兩種數據存儲引擎,二者均可用來存儲表和索引,各有優缺點,視具體應用而定。基本的差異爲:MyISAM 類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,可是不提供事務支持,而 InnoDB提供事務支持以及外部鍵等高級數據庫功能。安全
InnoDB 給 MySQL 提供了具備事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)、多版本併發控制(multi-versioned concurrency control)的事務安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行級鎖(locking on row level),提供與 Oracle 相似的不加鎖讀取(non-locking read in SELECTs)。InnoDB鎖定在行級而且也在SELECT語句提供一個Oracle風格一致的非鎖定讀。另外InnoDB是爲處理巨大數據量時的最 大性能設計。它的CPU效率多是任何其它基於磁盤的關係數據庫引擎所不能匹敵的。MySQLInnoDBDialect基於上也就有InnoDB相同的 功能.服務器
InnoDB存儲引擎被徹底與MySQL服務器整合,InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它本身的緩衝池。 InnoDB存儲它的表&索引在一個表空間中,表空間能夠包含數個文件(或原始磁盤分區)。這與MyISAM表不一樣,好比在MyISAM表中每一個表被存在 分離的文件中。InnoDB 表能夠是任何尺寸,即便在文件尺寸被限制爲2GB的操做系統上。併發
InnoDB是事務安全的.它與BDB類型具備相同的特性,它們還支持外鍵.InnoDB表格速度很快.具備比BDB還豐富的特性,所以若是須要一個事務 安全的存儲引擎,建議使用它.若是你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表。工具
在 http://www.innodb.com/ 上能夠找到 InnoDB 最新的信息。InnoDB 手冊的最新版本老是被放置在那裏,而且在那裏能夠獲得 InnoDB 的商業許可(order commercial licenses)以及支持。性能
MyISAM是MySQL默認存儲引擎。每一個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名爲.MYD (MYData)。索引文件的擴展名是.MYI (MYIndex)。大數據
MyISAM基於傳統的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲記錄和文件的標準方法.與其餘存儲引擎比較,MyISAM具備檢查和修復表格的大多數工具. MyISAM表格能夠被壓縮,並且它們支持全文搜索.它們不是事務安全的,並且也不支持外鍵。若是事物回滾將形成不徹底回滾,不具備原子性。若是執行大量 的SELECT,MyISAM是更好的選擇。操作系統
MyIASM是IASM表的新版本,有以下擴展:
·二進制層次的可移植性。
·NULL列索引。
·對變長行比ISAM表有更少的碎片。
·支持大文件。
·更好的索引壓縮。
·更好的鍵碼統計分佈。
·更好和更快的auto_increment處理。設計
下面是已知的二者之間的差異,僅供參考。
1.InnoDB不支持FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(*)語句包含 where條件時,兩種表的操做是同樣的。
3.對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。
4.DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除。
5.LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。
另外,InnoDB表的行鎖也不是絕對的,若是在執行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表,例如update table set num=1 where name like 「�a%」。
任何一種表都不是萬能的,只用恰當的針對業務類型來選擇合適的表類型,才能最大的發揮MySQL的性能優點。