MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。
例如,如果你在研究大量的臨時數據,你也許需要使用內存存儲引擎。內存存儲引擎能夠在內存中存儲所有的表格數據。又或者,你也許需要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。
這些不同的技術以及配套的相關功能在 MySQL中被稱作存儲引擎(也稱作表類型)。 MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啟用。你可以選擇適用于服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你需要你的數據結合什么性能和功能的時候為你提供最大的靈活性。
選擇如何存儲和檢索你的數據的這種靈活性是MySQL為什么如此受歡迎的主要原因。其它數據庫系統(包括大多數商業選擇)僅支持一種類型的數據存儲。遺憾的是,其它類型的數據庫解決方案采取的“一個尺碼滿足一切需求”的方式意味著你要么就犧牲一些性能,要么你就用幾個小時甚至幾天的時間詳細調整你的數據庫。使用MySQL,我們僅需要修改我們使用的存儲引擎就可以了。
MySQL常用的存儲引擎為MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事務安全表,其他存儲引擎都是非事務安全表。
MyISAM不支持事務、也不支持外鍵,但其訪問速度快,對事務完整性沒有要求。
InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是比起MyISAM存儲引擎,InnoDB寫的處理效率差一些并且會占用更多的磁盤空間以保留數據和索引。
MEMORY存儲引擎使用存在內存中的內容來創建表。每個MEMORY表只實際對應一個磁盤文件。MEMORY類型的表訪問非常得快,因為它的數據是放在內存中的,并且默認使用HASH索引。但是一旦服務關閉,表中的數據就會丟失掉。
MERGE存儲引擎是一組MyISAM表的組合,這些MyISAM表必須結構完全相同。MERGE表本身沒有數據,對MERGE類型的表進行查詢、更新、刪除的操作,就是對內部的MyISAM表進行的。
MyISAM表還支持3中不同的存儲格式:
1 靜態表
2 動態表
3 壓縮表
靜態表是默認的存儲格式,靜態表中的字段都是非變長的字段,優點是:存儲非常迅速,容易緩存,出現故障容易恢復;缺點是:占用的空間通常比動態表多。
MySQL支持外鍵存儲引擎只有InnoDB,在創建外鍵的時候,要求附表必須有對應的索引,子表在創建外鍵的時候也會自動創建對應的索引。
InnoDB存儲方式為兩種:1 使用共享表空間存儲 2 使用多表空間
MEMORY類型的存儲引擎主要用于那些內容變化不頻繁的代碼表,或者作為統計操作的中間結果表,便于高效地堆中間結果進行分析并得到最終的統計結果。對MEMORY存儲引擎的表進行更新操作要謹慎,因為數據并沒有實際寫入到磁盤中,所以一定要對下次重新啟動服務后如何獲得這些修改后的數據有所考慮。