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