国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于MY S Q L數(shù)據(jù)庫存儲(chǔ)引擎的研究

2018-03-21 00:47:15高見斌
數(shù)字通信世界 2018年5期
關(guān)鍵詞:主鍵事務(wù)引擎

高見斌

(武漢職業(yè)技術(shù)學(xué)院,武漢 430074)

數(shù)據(jù)庫是指按照某種模型組織起來的、能夠長(zhǎng)久保存在計(jì)算機(jī)存儲(chǔ)設(shè)備上,用戶或應(yīng)用程序能夠共享使用的數(shù)據(jù)集合。MySQL是一個(gè)關(guān)系數(shù)據(jù)庫管理系統(tǒng),用戶可以直接從官方網(wǎng)站免費(fèi)下載。因?yàn)镸ySQL軟件小、速度快、成本低,MySQL作為網(wǎng)站數(shù)據(jù)庫成為了眾多中小型網(wǎng)站的選擇。MySQ不僅擁有別的數(shù)據(jù)庫不能比擬的獨(dú)特功能,而且MySQL數(shù)據(jù)庫是目前運(yùn)行速度最快的非過程化語言數(shù)據(jù)庫。MySQL這些優(yōu)勢(shì)得益于數(shù)據(jù)庫存儲(chǔ)引擎的應(yīng)用。

1 存儲(chǔ)引擎的定義

數(shù)據(jù)庫存儲(chǔ)引擎就是在物理層上實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和處理的方法,即怎樣存儲(chǔ)數(shù)據(jù)、怎樣建立數(shù)據(jù)索引和怎樣對(duì)數(shù)據(jù)進(jìn)行操作等。不同的存儲(chǔ)引擎提供不同的存儲(chǔ)方法、索引方法、操作方法和鎖定措施。使用不同的存儲(chǔ)引擎,可以獲得不同的功能。MySQL的核心就是存儲(chǔ)引擎。數(shù)據(jù)庫管理系統(tǒng)使用數(shù)據(jù)引擎進(jìn)行創(chuàng)建、查詢、更新和刪除數(shù)據(jù)操作。許多不同的數(shù)據(jù)庫管理系統(tǒng)都支持多種不同的數(shù)據(jù)引擎。由于在關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)的存儲(chǔ)是以表的形式存儲(chǔ)的,因此存儲(chǔ)引擎也可以稱作是存儲(chǔ)和操作表的類型。數(shù)據(jù)庫存儲(chǔ)引擎決定了表的存儲(chǔ)方式和操作方式。

如果想實(shí)現(xiàn)所有數(shù)據(jù)存儲(chǔ)管理機(jī)制保持不變,那么數(shù)據(jù)庫中只能使用一種存儲(chǔ)引擎,SQL Server和Oracle就是只使用一種存儲(chǔ)引擎的數(shù)據(jù)庫。MySql允許用戶根據(jù)自己的需要編寫自己的存儲(chǔ)引擎。事實(shí)上,MySql數(shù)據(jù)庫提供了多種存儲(chǔ)引擎供用戶選擇,以實(shí)現(xiàn)不同的功能需求。

2 存儲(chǔ)引擎的分類

MySQL提供了多個(gè)不同的存儲(chǔ)引擎,分為處理事務(wù)安全表的引擎和處理非事務(wù)安全表的引擎兩大類。MySQL5.7支持的存儲(chǔ)引擎有MyISAM、InnoDB、Memory、Archive、Merge、CSV、Federated、BLACKHOLE等。在MySQL中,不要求使用同一種存儲(chǔ)引擎,根據(jù)具體的需求,可以對(duì)每一個(gè)表使用不同的存儲(chǔ)引擎。

3 各種存儲(chǔ)引擎特性比較

3.1 InnoDB存儲(chǔ)引擎

InnoDB是事務(wù)型數(shù)據(jù)庫的首選引擎,為Mysql的表提供了具有提交、回滾、崩潰恢復(fù)功能,支持聚簇索引、輔助索引、hash索引,支持多版本并發(fā)控制事務(wù)安全,支持行鎖定和外鍵約束。從MySQL 5.5.5之后,InnoDB作為默認(rèn)存儲(chǔ)引擎。相對(duì)MySQL來說,寫處理能力不強(qiáng),并且會(huì)占用較多存儲(chǔ)空間以保存數(shù)據(jù)及其索引。InnoDB的主要特性如下:

(1)支持自動(dòng)增長(zhǎng)列。InnoDB存儲(chǔ)引擎支持AUTOINCREMENT自動(dòng)增長(zhǎng)列。自動(dòng)增長(zhǎng)列的值不能為空,且值必須唯一。如果將0或null值插入,則實(shí)際插入的值為自動(dòng)增長(zhǎng)后的值。自動(dòng)增長(zhǎng)列的初始值默認(rèn)從1開始,可以用alter table語句強(qiáng)行設(shè)置。每張表的數(shù)據(jù)在存儲(chǔ)時(shí)都按主鍵順序存放。假定在表定義時(shí)沒有指定主鍵,InnoDB存儲(chǔ)引擎會(huì)為每一行生成一個(gè)6字節(jié)的ROWID,并以此作為主鍵。此ROWID由自動(dòng)增長(zhǎng)列的值進(jìn)行填充。對(duì)于InnoDB表自動(dòng)增長(zhǎng)列必須是組合索引的第一列,或者是索引。對(duì)于MYISAM表,可以是組合索引的其他列,插入一行數(shù)據(jù)后,自動(dòng)增長(zhǎng)列是按照組合索引的前面幾列進(jìn)行排序后遞增的。

(2)存儲(chǔ)格式。InnoDB用以下兩種方式存儲(chǔ)表和索引:a.使用共享表空間存儲(chǔ)。表結(jié)構(gòu)保存在.frm文件中。數(shù)據(jù)和索引保存在innodb_data_ fi le_path和innodb_data_home_dir定義的表空間中,可以是多個(gè)文件。b.利用多表空間進(jìn)行存儲(chǔ)。表結(jié)構(gòu)仍然保存在.frm文件中,但每個(gè)表的數(shù)據(jù)和索引單獨(dú)保存在.ibd文件中。如果為分區(qū)表,那么每個(gè)分區(qū)對(duì)應(yīng)單獨(dú)的.ibd文件,文件名是’表名+分區(qū)名’。使用多表空間存儲(chǔ),只針對(duì)新建表有效,且要設(shè)置參數(shù)innodb_ fi le_per_table,重啟mysql服務(wù)才能生效。

(3)支持外鍵約束(foreign key)。在MySQL的幾種存儲(chǔ)引擎中,只有InnoDB存儲(chǔ)引擎支持外鍵約束。外鍵使得表與表之間產(chǎn)生關(guān)聯(lián)。外鍵所在表為參照表,外鍵所依賴的表為被參照表。參照中表的外鍵在被參照表中必須是主鍵。當(dāng)更新或刪除被參照表中的某個(gè)記錄時(shí),參照中表的數(shù)據(jù)相應(yīng)地也改變。創(chuàng)建索引時(shí),可以指定更新、刪除被參照表時(shí)對(duì)參照表的相應(yīng)操作。

(4)InnoDB是為處理巨大數(shù)據(jù)量而設(shè)計(jì)出來的,中央處理器CPU處理效率高,任何其他的關(guān)系型數(shù)據(jù)庫引擎可能都不能與之相比。

3.2 MyISAM存儲(chǔ)引擎

在MySQL 5.5.5之前版本中,MyISAM是MySQL默認(rèn)的存儲(chǔ)引擎,后期對(duì)其進(jìn)行了擴(kuò)展。MyISAM存儲(chǔ)引擎不支持事務(wù)和外鍵約束,但擁有較高的插入、查詢速度,對(duì)事務(wù)完整性沒有要求,適合于以SELECT或INSERT操作為主的表。在網(wǎng)頁、數(shù)據(jù)倉(cāng)儲(chǔ)等應(yīng)用環(huán)境下,MyISAM存儲(chǔ)引擎常被采用。(1)存儲(chǔ)文件。每個(gè)MyISAM引擎物理上存儲(chǔ)為3個(gè)文件,文件名與表名相同,存儲(chǔ)表定義的文件擴(kuò)展名為.frm,存儲(chǔ)數(shù)據(jù)的文件擴(kuò)展名為.MYD,存儲(chǔ)索引的文件擴(kuò)展名為.MYI,其中數(shù)據(jù)文件和索引文件可以放置在不同路徑下,以達(dá)到平衡輸入輸出的目的。在創(chuàng)建表時(shí),可以通過DATA DIRRECTORY和INDEX DIRRECTORY語句指定數(shù)據(jù)文件和索引文件的目錄,注意需要絕對(duì)路徑,且有訪問權(quán)限。由于各種原因,MyISAM類型的表可能會(huì)被破壞,可以使用REPAIR TABLE語句修復(fù)??梢杂肅HECK TABLE語句檢查表的狀況。(2)存儲(chǔ)格式。MyISAM類型的表支持三種不同的存儲(chǔ)格式。一是靜態(tài)表,這是默認(rèn)的存儲(chǔ)格式。優(yōu)點(diǎn)是存儲(chǔ)速度快,容易緩存,字段長(zhǎng)度固定。缺點(diǎn)是占用空間多。值得注意的是,字段存儲(chǔ)按照寬度定義補(bǔ)足空格,訪問應(yīng)用時(shí)去掉空格;特別需要注意的是,如果字段本身就帶有空格,也會(huì)去掉。二是動(dòng)態(tài)表,特點(diǎn)是字段變長(zhǎng),不固定記錄長(zhǎng)度,優(yōu)點(diǎn)是占用空間少。缺點(diǎn)是頻繁的更新、刪除操作會(huì)產(chǎn)生碎片,需要定期清理,且若出現(xiàn)故障,難以恢復(fù)。三是壓縮表,可用myisampack工具創(chuàng)建,單獨(dú)壓縮每個(gè)記錄,占用空間小,訪問速度快。

3.3 MEMORY存儲(chǔ)引擎

MEMORY存儲(chǔ)引擎使用存在于內(nèi)存中的內(nèi)容來創(chuàng)建表,是MySQL中一類特殊的存儲(chǔ)引擎。每個(gè)表實(shí)際對(duì)應(yīng)一個(gè)格式為.frm的磁盤文件。這類表默認(rèn)HASH索引,且數(shù)據(jù)在內(nèi)存中,因此訪問速度非???;不足之處是,一旦停止服務(wù),表中的數(shù)據(jù)會(huì)丟失。系統(tǒng)變量max_heap_table_size決定表中可以存放的數(shù)據(jù)量大小,初始值為16MB,可按需求改變。同時(shí)在通過MAX_ROWS子句定義MEMORY表的最大行數(shù)。MEMORY存儲(chǔ)引擎主要用于統(tǒng)計(jì)操作時(shí)作為中間表,或用于那些內(nèi)容穩(wěn)定的表。對(duì)于這類表,需要注意的是,一旦重啟電腦,數(shù)據(jù)則會(huì)丟失,原因是數(shù)據(jù)并沒有寫入磁盤保存。

3.4 ARCHIVE存儲(chǔ)引擎

ARCHIVE存儲(chǔ)引擎的特點(diǎn)是擁有優(yōu)良的壓縮機(jī)制,壓縮比高,存儲(chǔ)空間相對(duì)較少,僅支持插入和查詢兩種功能,從Mysql5.5以后開始支持索引(早期不支持索引)。ARCHIVE存儲(chǔ)引擎主要是把數(shù)據(jù)歸檔,不支持其他更多的高級(jí)功能。ARCHIVE存儲(chǔ)引擎一般用來當(dāng)倉(cāng)庫使用,存儲(chǔ)歷史數(shù)據(jù)或日志信息。ARCHIVE存儲(chǔ)引擎不支持事務(wù)。

4 存儲(chǔ)引擎的選擇

以上所述,每種存儲(chǔ)引擎各有特點(diǎn)。具體應(yīng)用時(shí)選用什么類型的存儲(chǔ)引擎,需要結(jié)合個(gè)人需求和數(shù)據(jù)庫引擎的特點(diǎn)來綜合考慮。InnoDB是MySQL5.5版本以后的默認(rèn)存儲(chǔ)引擎,主要用來處理大量的短期事務(wù)。通常優(yōu)先選用InnoDB引擎,除非有非常特別的原因需要使用其他存儲(chǔ)引擎。假設(shè)插入和查詢記錄操作很頻繁,那么MyISAM引擎是不錯(cuò)的選擇,因?yàn)樗芴峁┹^高的處理效率。Archive存儲(chǔ)引擎因提供高的壓縮功能和支持插入和查詢操作,適合數(shù)據(jù)采集類和日志應(yīng)用。如果追求操作速度快,并且只是臨時(shí)存放少量數(shù)據(jù),可以選擇Memory引擎,這種存儲(chǔ)引擎因數(shù)據(jù)保存在內(nèi)存中,一旦掉電或重啟,數(shù)據(jù)就會(huì)丟失,安全性不高。更為靈活的是,可以根據(jù)不同的需求,在一個(gè)MYSQL數(shù)據(jù)庫中,多種不同的存儲(chǔ)引擎可以被混合使用。

[1] 武洪萍.MYSQL數(shù)據(jù)庫原理及應(yīng)用[M].北京:人民郵電出版社,2014.

[2] 王威.MYSQL數(shù)據(jù)庫源代碼分析與存儲(chǔ)引擎的設(shè)計(jì)[D].南京郵電大學(xué),2012.

猜你喜歡
主鍵事務(wù)引擎
“事物”與“事務(wù)”
基于分布式事務(wù)的門架數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
基于Go 實(shí)現(xiàn)的分布式主鍵系統(tǒng)研究
河湖事務(wù)
基于外鍵的E-R圖繪制方法研究
藍(lán)谷: “涉藍(lán)”新引擎
商周刊(2017年22期)2017-11-09 05:08:31
無形的引擎
河南電力(2015年5期)2015-06-08 06:01:46
基于Cocos2d引擎的PuzzleGame開發(fā)
SQLServer自治事務(wù)實(shí)現(xiàn)方案探析
數(shù)據(jù)庫主鍵的設(shè)計(jì)方法探討
名山县| 柳州市| 娱乐| 图片| 德江县| 昭通市| 蓬莱市| 大悟县| 玉田县| 兴仁县| 东台市| 岐山县| 吉林市| 乐山市| 灵武市| 阿勒泰市| 滨州市| 来凤县| 剑阁县| 太保市| 梨树县| 新河县| 孟村| 石林| 荣昌县| 信阳市| 即墨市| 乌拉特中旗| 繁昌县| 旅游| 建始县| 务川| 梅州市| 曲周县| 尉氏县| 达日县| 中牟县| 甘泉县| 广灵县| 盘山县| 蚌埠市|