MySQL將每個數據庫(也可以稱為schema)保存為數據目錄下的一個子目錄,創建表時,MySQL會在數據庫子目錄下創建一個和表同名的 .frm文件保存表的定義。(也因此MySQL數據庫和表的定義對大小寫的敏感性與具體平臺密切相關)
一、InnoDB InnoDB是MySQL的默認事務型引擎,也是最重要,使用最廣泛的存儲引擎。他是用來處理大量的短期事務,短期事務大部分情況是正常提交的,很少會被回滾。 InnoDB的性能和自動崩潰恢復特性,使得它在非事務型的需求中也很流行。
InnoDB的歷史: 2008年發布InnoDB plugin,適用于MySQL 5.1 版本,但當時MySQL默認還是使用舊的InnoDB引擎。在Oracle收購Sun后發布的MySQL5.5中才徹底使用InnoDB plugin替代了舊版本的InnoDB
這個新版本支持一些新特性,例如利用排序創建索引、刪除或者增加索引時不需要復制全表數據、新的支持壓縮的存儲格式,新的大型列值如BLOB的存儲方式,以及文件格式管理等。
InnoDB的數據存儲在表空間中,表空間是由InnoDB管理的一個黑盒子,由一系列的數據文件組成,可以將每個表的數據和索引存放在單獨的文件中。
采用MVCC來支持高并發,并且實現4個標準的隔離級別,默認級別是REPEATABLE READ(可重復讀),并且通過間隙鎖策略防止幻讀的出現。
InnoDB表示基于聚族索引建立的,聚族索引對主鍵查詢有很高的性能,若表上的索引較多的話,主鍵應當盡可能的小。
二、MyISAM 5.1之前版本采用的存儲引擎,提供了包括全文索引,壓縮,空間函數等,但MyISAM不支持事務和行級鎖,而且有個缺陷就是崩潰后無法安全恢復。MyISAM會將表存儲在兩個文件中:數據文件和索引文件,分別以.MYD和.MYI為擴展名
三、MySQL內建的其他存儲引擎 Archive引擎 只支持Insert和select操作,select查詢需要執行全表掃描,適合日志和數據采集類應用。支持行級鎖和高并發的插入。
Blackhole引擎 CSV引擎 Federated引擎 Memory引擎 Merge 引擎 NDB集群引擎
四、如何選擇合適的引擎 大部分情況下,InnoDB都是正確的選擇 除非需要用到某些InnoDB不具備的特性,并且沒有其他辦法可以替代,否則都應該優先選擇InnoDB引擎。例如,要用到全文索引,建議優先考慮InnoDB加上Sphinx的組合。
除非萬不得已,否則建議不要混合使用多種存儲引擎,否則可能帶來一系列復雜的問題,以及一些潛在的bug和邊界問題。
日志型應用
假設需要實時地記錄一臺中心電話交換機的每一通電話的日志到MySQL中,或者通過Apache的mod_log_sql模塊將網站的所有訪問信息直接記錄到表中。
這一類應用的插入速度有很高的要求,數據庫不能成為瓶頸。MyISAM或者Archive存儲引擎對這類應用比較合適,因為他們開銷低,插入速度非常快。
做分析報表時,利用MySQL內置的復制方案將數據復制一份到備庫,然后在備庫,然后在備庫上執行比較消耗時間和CPU的查詢。
不要輕易相信“MyISAM比InnoDB快”之類的經驗之談,這個結論往往不是絕對的。在很多我們已知的場景中,InnoDB的速度都可以讓MyISAM望塵莫及。
新聞熱點
疑難解答