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