高見斌
(武漢職業(yè)技術(shù)學(xué)院,武漢 430074)
數(shù)據(jù)庫是指按照某種模型組織起來的、能夠長久保存在計算機存儲設(shè)備上,用戶或應(yīng)用程序能夠共享使用的數(shù)據(jù)集合。MySQL是一個關(guān)系數(shù)據(jù)庫管理系統(tǒng),用戶可以直接從官方網(wǎng)站免費下載。因為MySQL軟件小、速度快、成本低,MySQL作為網(wǎng)站數(shù)據(jù)庫成為了眾多中小型網(wǎng)站的選擇。MySQ不僅擁有別的數(shù)據(jù)庫不能比擬的獨特功能,而且MySQL數(shù)據(jù)庫是目前運行速度最快的非過程化語言數(shù)據(jù)庫。MySQL這些優(yōu)勢得益于數(shù)據(jù)庫存儲引擎的應(yīng)用。
數(shù)據(jù)庫存儲引擎就是在物理層上實現(xiàn)數(shù)據(jù)存儲和處理的方法,即怎樣存儲數(shù)據(jù)、怎樣建立數(shù)據(jù)索引和怎樣對數(shù)據(jù)進行操作等。不同的存儲引擎提供不同的存儲方法、索引方法、操作方法和鎖定措施。使用不同的存儲引擎,可以獲得不同的功能。MySQL的核心就是存儲引擎。數(shù)據(jù)庫管理系統(tǒng)使用數(shù)據(jù)引擎進行創(chuàng)建、查詢、更新和刪除數(shù)據(jù)操作。許多不同的數(shù)據(jù)庫管理系統(tǒng)都支持多種不同的數(shù)據(jù)引擎。由于在關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)的存儲是以表的形式存儲的,因此存儲引擎也可以稱作是存儲和操作表的類型。數(shù)據(jù)庫存儲引擎決定了表的存儲方式和操作方式。
如果想實現(xiàn)所有數(shù)據(jù)存儲管理機制保持不變,那么數(shù)據(jù)庫中只能使用一種存儲引擎,SQL Server和Oracle就是只使用一種存儲引擎的數(shù)據(jù)庫。MySql允許用戶根據(jù)自己的需要編寫自己的存儲引擎。事實上,MySql數(shù)據(jù)庫提供了多種存儲引擎供用戶選擇,以實現(xiàn)不同的功能需求。
MySQL提供了多個不同的存儲引擎,分為處理事務(wù)安全表的引擎和處理非事務(wù)安全表的引擎兩大類。MySQL5.7支持的存儲引擎有MyISAM、InnoDB、Memory、Archive、Merge、CSV、Federated、BLACKHOLE等。在MySQL中,不要求使用同一種存儲引擎,根據(jù)具體的需求,可以對每一個表使用不同的存儲引擎。
InnoDB是事務(wù)型數(shù)據(jù)庫的首選引擎,為Mysql的表提供了具有提交、回滾、崩潰恢復(fù)功能,支持聚簇索引、輔助索引、hash索引,支持多版本并發(fā)控制事務(wù)安全,支持行鎖定和外鍵約束。從MySQL 5.5.5之后,InnoDB作為默認(rèn)存儲引擎。相對MySQL來說,寫處理能力不強,并且會占用較多存儲空間以保存數(shù)據(jù)及其索引。InnoDB的主要特性如下:
(1)支持自動增長列。InnoDB存儲引擎支持AUTOINCREMENT自動增長列。自動增長列的值不能為空,且值必須唯一。如果將0或null值插入,則實際插入的值為自動增長后的值。自動增長列的初始值默認(rèn)從1開始,可以用alter table語句強行設(shè)置。每張表的數(shù)據(jù)在存儲時都按主鍵順序存放。假定在表定義時沒有指定主鍵,InnoDB存儲引擎會為每一行生成一個6字節(jié)的ROWID,并以此作為主鍵。此ROWID由自動增長列的值進行填充。對于InnoDB表自動增長列必須是組合索引的第一列,或者是索引。對于MYISAM表,可以是組合索引的其他列,插入一行數(shù)據(jù)后,自動增長列是按照組合索引的前面幾列進行排序后遞增的。
(2)存儲格式。InnoDB用以下兩種方式存儲表和索引:a.使用共享表空間存儲。表結(jié)構(gòu)保存在.frm文件中。數(shù)據(jù)和索引保存在innodb_data_ fi le_path和innodb_data_home_dir定義的表空間中,可以是多個文件。b.利用多表空間進行存儲。表結(jié)構(gòu)仍然保存在.frm文件中,但每個表的數(shù)據(jù)和索引單獨保存在.ibd文件中。如果為分區(qū)表,那么每個分區(qū)對應(yīng)單獨的.ibd文件,文件名是’表名+分區(qū)名’。使用多表空間存儲,只針對新建表有效,且要設(shè)置參數(shù)innodb_ fi le_per_table,重啟mysql服務(wù)才能生效。
(3)支持外鍵約束(foreign key)。在MySQL的幾種存儲引擎中,只有InnoDB存儲引擎支持外鍵約束。外鍵使得表與表之間產(chǎn)生關(guān)聯(lián)。外鍵所在表為參照表,外鍵所依賴的表為被參照表。參照中表的外鍵在被參照表中必須是主鍵。當(dāng)更新或刪除被參照表中的某個記錄時,參照中表的數(shù)據(jù)相應(yīng)地也改變。創(chuàng)建索引時,可以指定更新、刪除被參照表時對參照表的相應(yīng)操作。
(4)InnoDB是為處理巨大數(shù)據(jù)量而設(shè)計出來的,中央處理器CPU處理效率高,任何其他的關(guān)系型數(shù)據(jù)庫引擎可能都不能與之相比。
在MySQL 5.5.5之前版本中,MyISAM是MySQL默認(rèn)的存儲引擎,后期對其進行了擴展。MyISAM存儲引擎不支持事務(wù)和外鍵約束,但擁有較高的插入、查詢速度,對事務(wù)完整性沒有要求,適合于以SELECT或INSERT操作為主的表。在網(wǎng)頁、數(shù)據(jù)倉儲等應(yīng)用環(huán)境下,MyISAM存儲引擎常被采用。(1)存儲文件。每個MyISAM引擎物理上存儲為3個文件,文件名與表名相同,存儲表定義的文件擴展名為.frm,存儲數(shù)據(jù)的文件擴展名為.MYD,存儲索引的文件擴展名為.MYI,其中數(shù)據(jù)文件和索引文件可以放置在不同路徑下,以達到平衡輸入輸出的目的。在創(chuàng)建表時,可以通過DATA DIRRECTORY和INDEX DIRRECTORY語句指定數(shù)據(jù)文件和索引文件的目錄,注意需要絕對路徑,且有訪問權(quán)限。由于各種原因,MyISAM類型的表可能會被破壞,可以使用REPAIR TABLE語句修復(fù)。可以用CHECK TABLE語句檢查表的狀況。(2)存儲格式。MyISAM類型的表支持三種不同的存儲格式。一是靜態(tài)表,這是默認(rèn)的存儲格式。優(yōu)點是存儲速度快,容易緩存,字段長度固定。缺點是占用空間多。值得注意的是,字段存儲按照寬度定義補足空格,訪問應(yīng)用時去掉空格;特別需要注意的是,如果字段本身就帶有空格,也會去掉。二是動態(tài)表,特點是字段變長,不固定記錄長度,優(yōu)點是占用空間少。缺點是頻繁的更新、刪除操作會產(chǎn)生碎片,需要定期清理,且若出現(xiàn)故障,難以恢復(fù)。三是壓縮表,可用myisampack工具創(chuàng)建,單獨壓縮每個記錄,占用空間小,訪問速度快。
MEMORY存儲引擎使用存在于內(nèi)存中的內(nèi)容來創(chuàng)建表,是MySQL中一類特殊的存儲引擎。每個表實際對應(yīng)一個格式為.frm的磁盤文件。這類表默認(rèn)HASH索引,且數(shù)據(jù)在內(nèi)存中,因此訪問速度非??欤徊蛔阒幨?,一旦停止服務(wù),表中的數(shù)據(jù)會丟失。系統(tǒng)變量max_heap_table_size決定表中可以存放的數(shù)據(jù)量大小,初始值為16MB,可按需求改變。同時在通過MAX_ROWS子句定義MEMORY表的最大行數(shù)。MEMORY存儲引擎主要用于統(tǒng)計操作時作為中間表,或用于那些內(nèi)容穩(wěn)定的表。對于這類表,需要注意的是,一旦重啟電腦,數(shù)據(jù)則會丟失,原因是數(shù)據(jù)并沒有寫入磁盤保存。
ARCHIVE存儲引擎的特點是擁有優(yōu)良的壓縮機制,壓縮比高,存儲空間相對較少,僅支持插入和查詢兩種功能,從Mysql5.5以后開始支持索引(早期不支持索引)。ARCHIVE存儲引擎主要是把數(shù)據(jù)歸檔,不支持其他更多的高級功能。ARCHIVE存儲引擎一般用來當(dāng)倉庫使用,存儲歷史數(shù)據(jù)或日志信息。ARCHIVE存儲引擎不支持事務(wù)。
以上所述,每種存儲引擎各有特點。具體應(yīng)用時選用什么類型的存儲引擎,需要結(jié)合個人需求和數(shù)據(jù)庫引擎的特點來綜合考慮。InnoDB是MySQL5.5版本以后的默認(rèn)存儲引擎,主要用來處理大量的短期事務(wù)。通常優(yōu)先選用InnoDB引擎,除非有非常特別的原因需要使用其他存儲引擎。假設(shè)插入和查詢記錄操作很頻繁,那么MyISAM引擎是不錯的選擇,因為它能提供較高的處理效率。Archive存儲引擎因提供高的壓縮功能和支持插入和查詢操作,適合數(shù)據(jù)采集類和日志應(yīng)用。如果追求操作速度快,并且只是臨時存放少量數(shù)據(jù),可以選擇Memory引擎,這種存儲引擎因數(shù)據(jù)保存在內(nèi)存中,一旦掉電或重啟,數(shù)據(jù)就會丟失,安全性不高。更為靈活的是,可以根據(jù)不同的需求,在一個MYSQL數(shù)據(jù)庫中,多種不同的存儲引擎可以被混合使用。
[1] 武洪萍.MYSQL數(shù)據(jù)庫原理及應(yīng)用[M].北京:人民郵電出版社,2014.
[2] 王威.MYSQL數(shù)據(jù)庫源代碼分析與存儲引擎的設(shè)計[D].南京郵電大學(xué),2012.