數據庫中的存儲引擎實際上是對使用了該引擎的表進行某種設置,數據庫中的表設定了什麼存儲引擎,那麼該表在數據存儲方式、數據更新方式、數據查詢性能以及是否支持索引等方面就會有不一樣的「效果」。在MySQL數據庫中存在着多種引擎(不一樣版本的MySQL數據庫支持的引擎不一樣),熟悉各類引擎才能在軟件開發中應用引擎,從而開發出高性能的軟件,MySQL數據庫中的引擎有哪些呢?通常來講,MySQL有如下幾種引擎:ISAM、MyISAM、HEAP(也稱爲MEMORY)、CSV、BLACKHOLE、ARCHIVE、PERFORMANCE_SCHEMA、InnoDB、 Berkeley、Merge、Federated和Cluster/NDB等,除此之外咱們也能夠參照MySQL++ API建立本身的數據庫引擎。下面逐次介紹一下各類引擎:
ISAM
該引擎在讀取數據方面速度很快,並且不佔用大量的內存和存儲資源;可是ISAM不支持事務處理、不支持外來鍵、不可以容錯、也不支持索引。該引擎在包括MySQL 5.1及其以上版本的數據庫中再也不支持。
MyISAM
該引擎基於ISAM數據庫引擎,除了提供ISAM裏所沒有的索引和字段管理等大量功能,MyISAM還使用一種表格鎖定的機制來優化多個併發的讀寫操做,可是須要常常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間,不然碎片也會隨之增長,最終影響數據訪問性能。MyISAM還有一些有用的擴展,例如用來修復數據庫文件的MyISAMChk工具和用來恢復浪費空間的 MyISAMPack工具。MyISAM強調了快速讀取操做,主要用於高負載的select,這可能也是MySQL深受Web開發的主要緣由:在Web開發中進行的大量數據操做都是讀取操做,因此大多數虛擬主機提供商和Internet平臺提供商(Internet Presence Provider,IPP)只容許使用MyISAM格式。
MyISAM類型的表支持三種不一樣的存儲結構:靜態型、動態型、壓縮型。
靜態型:指定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的數據類型),這樣MySQL就會自動使用靜態MyISAM格式。使用靜態格式的表的性能比較高,由於在維護和訪問以預約格式存儲數據時須要的開銷很低;但這種高性能是以空間爲代價換來的,由於在定義的時候是固定的,因此無論列中的值有多大,都會以最大值爲準,佔據了整個空間。
動態型:若是列(即便只有一列)定義爲動態的(xblob, xtext, varchar等數據類型),這時MyISAM就自動使用動態型,雖然動態型的表佔用了比靜態型表較少的空間,但帶來了性能的下降,由於若是某個字段的內容發生改變則其位置極可能須要移動,這樣就會致使碎片的產生,隨着數據變化的增多,碎片也隨之增長,數據訪問性能會隨之下降。
對於因碎片增長而下降數據訪問性這個問題,有兩種解決辦法:
a、儘量使用靜態數據類型;
b、常用optimize table table_name語句整理表的碎片,恢復因爲表數據的更新和刪除致使的空間丟失。若是存儲引擎不支持 optimize table table_name則能夠轉儲並 從新加載數據,這樣也能夠減小碎片;
壓縮型:若是在數據庫中建立在整個生命週期內只讀的表,則應該使用MyISAM的壓縮型表來減小空間的佔用。
HEAP(也稱爲MEMORY)
該存儲引擎經過在內存中建立臨時表來存儲數據。每一個基於該存儲引擎的表實際對應一個磁盤文件,該文件的文件名和表名是相同的,類型爲.frm。該磁盤文件只存儲表的結構,而其數據存儲在內存中,因此使用該種引擎的表擁有極高的插入、更新和查詢效率。這種存儲引擎默認使用哈希(HASH)索引,其速度比使用B-+Tree型要快,但也可使用B樹型索引。因爲這種存儲引擎所存儲的數據保存在內存中,因此其保存的數據具備不穩定性,好比若是mysqld進程發生異常、重啓或計算機關機等等都會形成這些數據的消失,因此這種存儲引擎中的表的生命週期很短,通常只使用一次。
CSV(Comma-Separated Values逗號分隔值)
使用該引擎的MySQL數據庫表會在MySQL安裝目錄data文件夾中的和該表所在數據庫名相同的目錄中生成一個.CSV文件(因此,它能夠將CSV類型的文件當作表進行處理),這種文件是一種普通文本文件,每一個數據行佔用一個文本行。該種類型的存儲引擎不支持索引,即便用該種類型的表沒有主鍵列;另外也不容許表中的字段爲null。
BLACKHOLE(黑洞引擎)
該存儲引擎支持事務,並且支持mvcc的行級鎖,寫入這種引擎表中的任何數據都會消失,主要用於作日誌記錄或同步歸檔的中繼存儲,這個存儲引擎除非有特別目的,不然不適合使用。詳見博客《BlackHole 存儲引擎》
ARCHIVE
該存儲引擎很是適合存儲大量獨立的、做爲歷史記錄的數據。區別於InnoDB和MyISAM這兩種引擎,ARCHIVE提供了壓縮功能,擁有高效的插入速度,可是這種引擎不支持索引,因此查詢性能較差一些。
PERFORMANCE_SCHEMA
該引擎主要用於收集數據庫服務器性能參數。這種引擎提供如下功能:提供進程等待的詳細信息,包括鎖、互斥變量、文件信息;保存歷史的事件彙總信息,爲提供MySQL服務器性能作出詳細的判斷;對於新增和刪除監控事件點都很是容易,並能夠隨意改變mysql服務器的監控週期,例如(CYCLE、MICROSECOND)。
InnoDB
該存儲引擎爲MySQL表提供了ACID事務支持、系統崩潰修復能力和多版本併發控制(即MVCC Multi-Version Concurrency Control)的行級鎖;該引擎支持自增加列(auto_increment),自增加列的值不能爲空,若是在使用的時候爲空則自動從現有值開始增值,若是有可是比如今的還大,則直接保存這個值; 該引擎存儲引擎支持外鍵(foreign key) ,外鍵所在的表稱爲子表而所依賴的表稱爲父表。該引擎在5.5後的MySQL數據庫中爲默認存儲引擎。
Berkeley(BDB)
該存儲引擎支持COMMIT和ROLLBACK等其餘事務特性。該引擎在包括MySQL 5.1及其以上版本的數據庫中再也不支持。
Merge
該引擎將必定數量的MyISAM表聯合而成一個總體。參見博客《MySQL Merge存儲引擎》
Federated
該存儲引擎能夠不一樣的Mysql服務器聯合起來,邏輯上組成一個完整的數據庫。這種存儲引擎很是適合數據庫分佈式應用。
Cluster/NDB
該存儲引擎用於多臺數據機器聯合提供服務以提升總體性能和安全性。適合數據量大、安全和性能要求高的場景。mysql