MySQL中的各種引擎
數據庫中的存儲引擎其實是對使用了該引擎的表進行某種設置,數據庫中的表設定了什麽存儲引擎,那麽該表在數據存儲方式、數據更新方式、數據查詢性能以及是否支持索引等方面就會有不同的“效果”。在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數據庫中存儲引擎的總結,只是重點總結了一下各種不同存儲引擎的特點,不對的地方還望各位指正,不勝感激。
MySQL中的各種引擎