標籤:外來鍵 解決 sep 主鍵 version 可變 資料庫伺服器 預設 targe
資料庫中的儲存引擎其實是對使用了該引擎的表進行某種設定,資料庫中的表設定了什麼儲存引擎,那麼該表在資料存放區方式、資料更新方式、資料查詢效能以及是否支援索引等方面就會有不同的“效果”。在MySQL資料庫中存在著多種引擎(不同版本的MySQL資料庫支援的引擎不同),熟悉各種引擎才能在軟體開發中應用引擎,從而開發出高效能的軟體,MySQL資料庫中的引擎有哪些呢?一般來說,MySQL有以下幾種引擎:ISAM、MyISAM、HEAP(也稱為MEMORY)、CSV、BLACKHOLE、ARCHIVE、PERFORMANCE_SCHEMA、InnoDB、 Berkeley、Merge、Federated和Cluster/NDB等,除此以外我們也可以參照MySQL++ API建立自己的資料庫引擎。下面逐次介紹一下各種引擎:
ISAM
該引擎在讀取資料方面速度很快,而且不佔用大量的記憶體和儲存資源;但是ISAM不支援交易處理、不支援外來鍵、不能夠容錯、也不支援索引。該引擎在包括MySQL5.1及其以上版本的資料庫中不再支援。
MyISAM
該引擎基於ISAM資料庫引擎,除了提供ISAM裡所沒有的索引和欄位管理等大量功能,MyISAM還使用一種表格鎖定的機制來最佳化多個並發的讀寫操作,但是需要經常運行OPTIMIZETABLE命令,來恢複被更新機制所浪費的空間,否則片段也會隨之增加,最終影響資料訪問效能。MyISAM還有一些有用的擴充,例如用來修複資料庫檔案的MyISAMChk工具和用來恢複浪費空間的MyISAMPack工具。MyISAM強調了快速讀取操作,主要用於高負載的select,這可能也是MySQL深受Web開發的主要原因:在Web開發中進行的大量資料操作都是讀取操作,所以大多數虛擬機器主機供應商和Internet平台供應商(InternetPresence Provider,IPP)只允許使用MyISAM格式。
MyISAM類型的表支援三種不同的儲存結構:靜態型、動態型、壓縮型。
靜態型:指定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的資料類型),這樣MySQL就會自動使用靜態MyISAM格式。使用靜態格式的表的效能比較高,因為在維護和訪問以預定格式儲存資料時需要的開銷很低;但這種高效能是以空間為代價換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為準,佔據了整個空間。
動態型:如果列(即使只有一列)定義為動態(xblob,xtext,varchar等資料類型),這時MyISAM就自動使用動態型,雖然動態型的表佔用了比靜態型表較少的空間,但帶來了效能的降低,因為如果某個欄位的內容發生改變則其位置很可能需要移動,這樣就會導致片段的產生,隨著資料變化的增多,片段也隨之增加,資料訪問效能會隨之降低。
對於因片段增加而降低資料訪問性這個問題,有兩種解決辦法:
a、儘可能使用待用資料類型;
b、經常使用optimize tabletable_name語句整理表的片段,恢複由於表資料的更新和刪除導致的空間丟失。如果儲存引擎不支援 optimize tabletable_name則可以轉儲並 重新載入資料,這樣也可以減少片段;
壓縮型:如果在資料庫中建立在整個生命週期內唯讀表,則應該使用MyISAM的壓縮型表來減少空間的佔用。
HEAP(也稱為MEMORY)
該儲存引擎通過在記憶體中建立暫存資料表來儲存資料。每個基於該儲存引擎的表實際對應一個磁碟檔案,該檔案的檔案名稱和表名是相同的,類型為.frm。該磁碟檔案只儲存表的結構,而其資料存放區在記憶體中,所以使用該種引擎的表擁有極高的插入、更新和查詢效率。這種儲存引擎預設使用雜湊(HASH)索引,其速度比使用B-+Tree型要快,但也可以使用B樹型索引。由於這種儲存引擎所儲存的資料儲存在記憶體中,所以其儲存的資料具有不穩定性,比如如果mysqld進程發生異常、重啟或電腦關機等等都會造成這些資料的消失,所以這種儲存引擎中的表的生命週期很短,一般只使用一次。
CSV(Comma-SeparatedValues逗號分隔值)
使用該引擎的MySQL資料庫表會在MySQL安裝目錄data檔案夾中的和該表所在資料庫名相同的目錄中產生一個.CSV檔案(所以,它可以將CSV類型的檔案當做表進行處理),這種檔案是一種普通文字檔,每個資料行佔用一個文本行。該種類型的儲存引擎不支援索引,即使用該種類型的表沒有主鍵列;另外也不允許表中的欄位為null。
BLACKHOLE(黑洞引擎)
該儲存引擎支援事務,而且支援mvcc的行級鎖,寫入這種引擎表中的任何資料都會消失,主要用於做日誌記錄或同步歸檔的中繼儲存,這個儲存引擎除非有特別目的,否則不適合使用。詳見部落格《BlackHole儲存引擎》
ARCHIVE
該儲存引擎非常適合儲存大量獨立的、作為記錄的資料。區別於InnoDB和MyISAM這兩種引擎,ARCHIVE提供了壓縮功能,擁有高效的插入速度,但是這種引擎不支援索引,所以查詢效能較差一些。
PERFORMANCE_SCHEMA
該引擎主要用於收集資料庫伺服器績效參數。這種引擎提供以下功能:提供進程等待的詳細資料,包括鎖、互斥變數、檔案資訊;儲存曆史的事件匯總資訊,為提供MySQL伺服器效能做出詳細的判斷;對於新增和刪除監控事件點都非常容易,並可以隨意改變mysql伺服器的監控周期,例如(CYCLE、MICROSECOND)。
InnoDB
該儲存引擎為MySQL表提供了ACID事務支援、系統崩潰修複能力和多版本並發控制(即MVCCMulti-Version ConcurrencyControl)的行級鎖;該引擎支援自增長列(auto_increment),自增長列的值不可為空,如果在使用的時候為空白則自動從現有值開始增值,如果有但是比現在的還大,則直接儲存這個值;該引擎儲存引擎支援外鍵(foreign key),外鍵所在的表稱為子表而所依賴的表稱為父表。該引擎在5.5後的MySQL資料庫中為預設儲存引擎。
Berkeley(BDB)
該儲存引擎支援COMMIT和ROLLBACK等其他事務特性。該引擎在包括MySQL5.1及其以上版本的資料庫中不再支援。
Merge
該引擎將一定數量的MyISAM表聯合而成一個整體。參見部落格《MySQLMerge儲存引擎》
Federated
該儲存引擎可以不同的Mysql伺服器聯合起來,邏輯上組成一個完整的資料庫。這種儲存引擎非常適合資料庫分布式應用。
Cluster/NDB
該儲存引擎用於多台資料機器聯合提供服務以提高整體效能和安全性。適合資料量大、安全和效能要求高的情境。
以上是對MySQL資料庫中儲存引擎的總結,只是重點總結了一下各種不同儲存引擎的特點,不對的地方還望各位指正,不勝感激。
MySQL中的各種引擎