寫在前面數據庫
MySQL,Oracle,SqlServer都是在關係型數據庫中都佔有一席之地,MySQL數據庫也被稱爲業內最普遍使用的開源數據庫之一,而插件式存儲引擎的是其最重要的特色之一,瞭解其存儲引擎能更方便的使用MySQL數據庫的特性。
緩存
本節目標安全
瞭解MySQL插件式存儲引擎服務器
掌握MyISAM和InnoDB存儲引擎的區別併發
插件式存儲引擎是什麼?ide
MySQL 的存儲引擎爲插件式存儲引擎,即容許MySQL 官方提供,又容許第三方經過MySQL的API接口自行開發存儲引擎。MySQL中使用各類不一樣的技術,將數據放在不一樣的文件系統中進行存儲,例如針對內存數據庫(MEMORY引擎)則將數據直接存儲在內存中。這些技術中的每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的功能和 能力,經過選擇不一樣的技術,用戶可以得到額外的速度或者功能,從而改善應用的總體功能。例如,若是要研究大量的臨時數據,也許就須要使用內存存儲引擎,內存存儲引擎可以在內存中存儲全部的表格數據,幫助用戶完成應用。又或者,用戶也許須要一個支持事務處理的數據庫,以確保事務處理不成功時數據的回退能力,這就須要使用支持事務處理的存儲引擎(InnoDB引擎)。這些不一樣的技術以及配套的相關功能在MySQL中被稱作存儲引擎(也稱作表類型)。MySQL默認配置了許多不一樣的 存儲引擎,能夠預先設置或者在MySQL服務器中啓用。能夠選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲信息、如何檢索這些信息以及須要數據結合什麼性能和功能的時候提供最大的靈活性。MySQL5.5以後提供10種存儲引擎,MEMORY,CSV,PERFORMANCE_SCHEMA,BLACKHOLE,MyISAM,MRG_MYISAM,ARCHIVE,FEDERATED,InnoDB,Aria。在MySQL的衆多存儲引擎中InoDB與MyISAM爲使用最多的兩個存儲引擎。因此本文也主要講述這兩個存儲引擎之間的區別。
高併發
MyISAM和InnoDB存儲引擎的區別性能
在說二者之間的區別以前,首先要弄清楚一個概念,存儲引擎是表級別的概念,因此才成爲表類型,每建立一張表均可以指定所使用的存儲引擎,可是並不建議每張表都交叉使用不一樣的引擎。
spa
1 數據文件插件
MyISAM存儲引擎每張表都建立三個文件
table_name.frm |
存儲表的結構 |
table_name.MYD |
存儲數據 |
table_name.MYI |
存儲索引 |
InnoDB對把數據存儲與表空間中,分爲兩種方式:全部InonoDB表的數據和索引放置於同一個表空間中和每一個表單獨使用一個表空間存儲表的數據和索引。
當全部表位於同一表空間中,其數據文件存於數據目錄下以ibddata[#]來命名。這種方式不利於管理和備份恢復。因此通常使用第二種方式,每張表建立單獨的表空間,用來實現InnoDB所支持的高級特性,好比單表導入導出,單標備份等功能。數據文件爲
table_name.ibd |
存儲數據和索引 |
table_name.frm |
存儲表結構定義 |
2 事務性
MyISAM類型的表強調性能,其執行速度比InnoDB類型更快但不提供事務的支持,也不支持外鍵,適用於大量select操做的應用場景。InnoDB支持事務,並把事務分爲四個隔離級別,READ-UNCOMMITTED:讀未提交容易發生髒讀;READ-COMMITTED:讀提交,該級別不可重複讀;REPEATABLE-READ:可重複讀,該級別容易發生幻讀;SERIALIZABLE:串行化;默認級別爲REPEATABLE-READ。適合對事務要求較高的場景中,較適用於處理大量短時間事務。
3 鎖粒度
MyISAM的鎖粒度較爲粗糙,爲表級鎖。而InnoDB爲行級鎖,並使用間隙鎖來防止幻讀。固然InnoDB的行級鎖也並不是絕對,當SQL語句在執行過程當中在不能肯定掃描範圍時也會對整張表進行鎖定,例如updatestudents set sex=」M」 where name like 「%aaa%」;
4 索引類型
InnoDB爲彙集索引,輔助索引,MyISAM爲非彙集索引而且支持全文索引(fulltext index)。
5 備份策略
InnoDB支持熱備、溫備、冷備。崩潰後可安全恢復。MyISAM最支持溫備與冷備。崩潰後沒法安全恢復。因爲MyISAM引擎不支持熱備,因此在不少須要熱備的應用場景中極不適用,近乎到了被拋棄的境地。
6 其餘
InnoDB支持自適應的hash索引,使用MVCC來支持高併發。在性能方面,支持預讀操做,內存數據緩衝,內存索引緩存,插入操做緩衝區等。InnoDB引擎支持延遲索引更新,和表壓縮等特性。
近年來,InnoDB已有取代MyISAM之趨勢。MySQL與mariadb的默認存儲引擎已使用InnoDB。