《MySQL存儲(chǔ)引擎詳解》要點(diǎn):
本文介紹了MySQL存儲(chǔ)引擎詳解,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
本文主要講解MySQL常用的存儲(chǔ)引擎,以及之間的顯著特點(diǎn)和區(qū)別.Verchielxy 原創(chuàng),轉(zhuǎn)載注明出處.
MySQL數(shù)據(jù)庫(kù)是一款關(guān)系型數(shù)據(jù)庫(kù),原型最早由瑞典一件公司開發(fā)而成,后來被Oracle收購(gòu),截止目前為止,仍然是一款開源的數(shù)據(jù)庫(kù).
由于Oracle已經(jīng)收購(gòu),所以目前MySQL仍然存在閉源的風(fēng)險(xiǎn),所以衍生出其他給予MySQL的分支版本,mariadb就是其中之一.
存儲(chǔ)引擎是相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)里面的表而言的.換句話說,你可以理解,表為一輛汽車,那么引擎就是發(fā)動(dòng)機(jī),決定汽車的動(dòng)力. 但是這里又有一點(diǎn)不同,就是發(fā)動(dòng)機(jī)的速度,不是決定一輛車好壞的唯一判別方式.同樣的,存儲(chǔ)引擎也是如此.
根據(jù)不同的使用場(chǎng)景需求,選擇不同的存儲(chǔ)引擎,這是一個(gè)良好開發(fā)的起點(diǎn).
下面的代碼可以看到有種存儲(chǔ)引擎
show engines;
MySQL存儲(chǔ)引擎有一共有8種
MyISAM
InnoDB
MRG_MYISAM
MEMORY
ARCHIVE
BLACKHOLE
CSV
FEDERATED
下面我們談一談常見的幾種存儲(chǔ)引擎,由于不同的MySQL版本對(duì)于很多細(xì)節(jié)方面的不同,造成的差異性很大, 這里我們以MySQL的5.6版本為主來討論.
MyISAM表是獨(dú)立于操作系統(tǒng)的,這說明可以輕松地將其從Windows服務(wù)器移植到Linux服務(wù)器;
每當(dāng)我們建立一個(gè)MyISAM引擎的表時(shí),就會(huì)在本地磁盤上建立三個(gè)文件,文件名就是表名.
例如,我建立了一個(gè)MyISAM引擎的example表,那么就會(huì)生成以下三個(gè)文件:
example.frm,存儲(chǔ)表定義;
example.MYD,存儲(chǔ)數(shù)據(jù);
example.MYI,存儲(chǔ)索引.
最重要的一點(diǎn),MyISAM表是無法處理事務(wù),這就意味著有事務(wù)處理需求的表,不能使用MyISAM存儲(chǔ)引擎.
也正是因?yàn)椴恢С质聞?wù),所以MyISAM的讀取速度是非常的快的,適合大數(shù)據(jù)量的read操作.
MyISAM一般性特點(diǎn)如下:
MyISAM存儲(chǔ)引擎在篩選大量數(shù)據(jù)時(shí)非常迅速
MyISAM的并發(fā)插入特性允許同時(shí)選擇和插入數(shù)據(jù)
MySQL 5.5、5.6默認(rèn)的存儲(chǔ)引擎.
InnoDB表類型可以看作是對(duì)MyISAM的進(jìn)一步更新產(chǎn)品,它提供了事務(wù)、行級(jí)鎖機(jī)制和外鍵約束的功能.
InnoDB表類型基于磁盤的資源是InnoDB表空間數(shù)據(jù)文件和它的日志文件,InnoDB 表的大小只受限于操作系統(tǒng)文件的大小,一般為 2GB
這里要提到的最重要的一點(diǎn)就是,它支持事務(wù).例如:一個(gè)高并發(fā)的量的商城網(wǎng)站,在同一時(shí)刻,要在不同的 表當(dāng)中就插入數(shù)據(jù),而這些數(shù)據(jù)之間有有關(guān)系,這個(gè)時(shí)候事務(wù)起到了決定性的作用.通俗理解起來就是, 要么一起操作成功,要么一起操作失敗.
支持事務(wù),能幫助很多應(yīng)用辦理了數(shù)據(jù)關(guān)聯(lián)方面的棘手問題.
ACID 事務(wù)
A 事務(wù)的原子性(Atomicity):指一個(gè)事務(wù)要么全部執(zhí)行,要么不執(zhí)行.也就是說一個(gè)事務(wù)不可能只執(zhí)行了一半就停止了.比如你從取款機(jī)取錢,這個(gè)事務(wù)可以分成兩個(gè)步驟:1)劃卡,2)出錢.不可能劃了卡,而錢卻沒出來,這兩步必須同時(shí)完成,要么就不完成.
C 事務(wù)的一致性(Consistency):指事務(wù)的運(yùn)行并不改變數(shù)據(jù)庫(kù)中數(shù)據(jù)的一致性.例如,完整性約束了a+b=10,一個(gè)事務(wù)改變了a,那么b也應(yīng)該隨之改變.
I 獨(dú)立性(Isolation):事務(wù)的獨(dú)立性也有稱作隔離性,是指兩個(gè)以上的事務(wù)不會(huì)出現(xiàn)交錯(cuò)執(zhí)行的狀態(tài).因?yàn)檫@樣可能會(huì)導(dǎo)致數(shù)據(jù)不一致.
D 持久性(Durability):事務(wù)的持久性是指事務(wù)執(zhí)行成功以后,該事務(wù)所對(duì)數(shù)據(jù)庫(kù)所作的更改便是持久的保存在數(shù)據(jù)庫(kù)之中,不會(huì)無緣無故的回滾.
對(duì)于鎖
MyISAM - 表鎖
InnoDB - 表鎖、行鎖 注意:InnoDB表的行鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表, 例如update table set num=1 where name like '%aaa%'
對(duì)于不帶where條件的count (select count(*) form table)
MyISAM - 只要簡(jiǎn)單的讀出保存好的行數(shù)
InnoDB - 不保存表的具體行數(shù),需要遍歷整個(gè)表
對(duì)于AUTO_INCREMENT
MyISAM - 每表一個(gè)AUTO_INCREMEN列的內(nèi)部處理,可用ALTER TABLE或myisamch來重置,對(duì)于AUTO_INCREMENT類型的字段,InnoDB中必須包括只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引
InnoDB - 自動(dòng)增長(zhǎng)計(jì)數(shù)器僅被存儲(chǔ)在主內(nèi)存中,而不是存在磁盤上, 如果你為一個(gè)表指定AUTO_INCREMENT列,在數(shù)據(jù)詞典里的InnoDB表句柄包括一個(gè)名為自動(dòng)增長(zhǎng)計(jì)數(shù)器的計(jì)數(shù)器,它被用在為該列賦新值
對(duì)于事務(wù)
MyISAM - 不支持事務(wù)
InnoDB - 支持事務(wù)
對(duì)于外鍵
MyISAM - 不支持外鍵
InnoDB - 支持外鍵
構(gòu)成上的區(qū)別
MyISAM - 每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件.第一個(gè)文件的名字以表的名字開始,擴(kuò)展名指出文件類型.
InnoDB - 基于磁盤的資源是InnoDB表空間數(shù)據(jù)文件和它的日志文件,InnoDB 表的大小只受限于操作系統(tǒng)文件的大小,一般為 2GB
對(duì)于全文索引
MyISAM - 支持全文索引
InnoDB - 不支持全文索引
對(duì)于 MySQL 5.6.4以上版本, InnoDB 支持英文全文索引,可以通過使用Sphinx從InnoDB中獲得全文索引
MRG_MYISAM存儲(chǔ)引擎是一組MyISAM表的組合,這些MyISAM表結(jié)構(gòu)必須完全相同,盡管其使用不如其它引擎突出,但是在某些情況下非常有用.說白了,Merge表就是幾個(gè)相同MyISAM表的聚合器;Merge表中并沒有數(shù)據(jù),對(duì)Merge類型的表可以進(jìn)行查詢、更新、刪除操作,這些操作實(shí)際上是對(duì)內(nèi)部的MyISAM表進(jìn)行操作.Merge存儲(chǔ)引擎的使用場(chǎng)景.
Memory 是內(nèi)存級(jí)別存儲(chǔ)引擎,數(shù)據(jù)存儲(chǔ)在內(nèi)存中,所以他能夠存儲(chǔ)的數(shù)據(jù)量較小.
因?yàn)閮?nèi)存的特性,存儲(chǔ)引擎對(duì)數(shù)據(jù)的一致性支持較差.鎖級(jí)別為表鎖,不支持事務(wù).但拜訪速度非常快,并且默認(rèn)使用 hash 索引.
Memory存儲(chǔ)引擎使用存在內(nèi)存中的內(nèi)容來創(chuàng)建表,每個(gè)Memory表只實(shí)際對(duì)應(yīng)一個(gè)磁盤文件,在磁盤中表現(xiàn)為.frm文件.
這種類型只支持select 和 insert語(yǔ)句,而且不支持索引.常應(yīng)用于日志記錄和聚合分析方面.
全部資料來源于google,MySQL官方文檔,英文和中文博客,由verchielxy翻譯整理而成.感謝這些作者為開發(fā)者提供的名貴資料.
歡迎參與《MySQL存儲(chǔ)引擎詳解》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/7125.html