MySql------存储引擎(InnoDB,ISAM)
MySql存儲(chǔ)引擎
- 導(dǎo)讀
- InnoDB存儲(chǔ)引擎
- 一、存儲(chǔ)結(jié)構(gòu)
- 二、存儲(chǔ)空間消耗
- 三、對(duì)事務(wù)支持情況
- 四、對(duì)鎖支持
- 五、表行數(shù)
- MyISAM存儲(chǔ)引擎
- 一、存儲(chǔ)結(jié)構(gòu)
- 二、存儲(chǔ)空間消耗
- 三、對(duì)事務(wù)支持情況
- 四、對(duì)鎖支持
- 五、表行數(shù)
- 為什么MyISAM會(huì)比Innodb 的查詢速度快
- 應(yīng)用場(chǎng)景選擇
導(dǎo)讀
MySQL支持的存儲(chǔ)引擎很多,其中包括MyISAM、InnoDB、MERGE、EXAMPLE、BDB、ARCHIVE、MEMORY、NDB Cluster等,其中InnoDB和BDB支持事務(wù)安全。同時(shí)MySql還支持一些第三方的存儲(chǔ)引擎,例如TokuDB(高寫性能高壓縮存儲(chǔ)引擎)、Infobright(列式存儲(chǔ)引擎)。本文主要講InnoDB和MyISAM這兩個(gè)普遍使用的存儲(chǔ)引擎之間差異,選擇場(chǎng)景。
InnoDB存儲(chǔ)引擎
InnoDB是MySQL最常用的數(shù)據(jù)庫(kù)引擎,是MySQL AB發(fā)布binary的標(biāo)準(zhǔn)之一。InnoDB存儲(chǔ)引擎由Innobase Oy公司所開發(fā),在2006年五月時(shí)被甲骨文公司并購(gòu)。與傳統(tǒng)的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事務(wù)(Transaction)功能,類似于PostgreSQL。
一、存儲(chǔ)結(jié)構(gòu)
所有的表都保存在同一個(gè)數(shù)據(jù)文件中(也可能是多個(gè)文件,或者是獨(dú)立的表空間文件),.frm文件同樣存儲(chǔ)為表結(jié)構(gòu)文件,.ibd文件存儲(chǔ)的是數(shù)據(jù)和索引文件,InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。
InnoDB支持聚簇索引和非聚簇索引
二、存儲(chǔ)空間消耗
InnoDB會(huì)在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。
三、對(duì)事務(wù)支持情況
擁有外鍵和事務(wù)支持,還具有事務(wù)提交(commit)、回滾(rollback)和崩潰修復(fù)能力(crach recovery capabilities)等這些事務(wù)安全(transaction-safe ACID compliant)型表。
InnoDB中必須包含主鍵索引。引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引也必須是組合索引的第一列。
四、對(duì)鎖支持
InnoDB存儲(chǔ)引擎支持表鎖,行鎖,行鎖可以大幅度提高用戶并發(fā)操作。對(duì)于 InnoDB 引擎來(lái)說(shuō),讀鎖和寫鎖可以加在表上,也可以加在行上。
對(duì)于并發(fā)讀和并發(fā)寫的問(wèn)題,可以通過(guò)實(shí)現(xiàn)一個(gè)由兩種類型的鎖組成的鎖系統(tǒng)來(lái)解決。這兩種類型的鎖通常被稱為 共享鎖(Shared Lock,S Lock) 和 排他鎖(Exclusive Lock,X Lock),也叫 讀鎖(readlock) 和 寫鎖(write lock):
共享鎖 / 讀鎖:允許事務(wù)讀(select)數(shù)據(jù)
排他鎖 / 寫鎖:允許事務(wù)刪除(delete)或更新(update)數(shù)據(jù)
InnoDB 存儲(chǔ)引擎的行級(jí)鎖是基于索引的,也就是說(shuō)當(dāng)索引失效或者說(shuō)根本沒(méi)有用索引的時(shí)候,行鎖就會(huì)升級(jí)成表鎖。
五、表行數(shù)
沒(méi)有保存表的總行數(shù),如果使用select count(*) from table;就會(huì)遍歷整個(gè)表,消耗相當(dāng)大,但是在加了wehre條件后,myisam和innodb處理的方式都一樣。
MyISAM存儲(chǔ)引擎
MyISAM是MySQL(5.5版之前)的默認(rèn)數(shù)據(jù)庫(kù)引擎,由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問(wèn)方法)改良。雖然查詢性能優(yōu)良,但有個(gè)缺點(diǎn):不支持事務(wù)(transaction)。所以最近幾年逐漸引入了InnoDB(另一種數(shù)據(jù)庫(kù)引擎),后來(lái)就逐漸取代MyISAM。
一、存儲(chǔ)結(jié)構(gòu)
每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件,它們以表的名字開頭來(lái)命名。.frm文件存儲(chǔ)表定義。.MYD(MYD)存儲(chǔ)數(shù)據(jù)文件。.MYI(MYIndex)存儲(chǔ)索引文件。
MyISAM只支持非聚簇索引
二、存儲(chǔ)空間消耗
MyISAM存儲(chǔ)空間是可被壓縮,存儲(chǔ)空間占用較小。MyISAM支持三種存儲(chǔ)格式:靜態(tài)表(默認(rèn),但是注意數(shù)據(jù)末尾不能有空格,會(huì)被去掉)、動(dòng)態(tài)表、壓縮表。
三、對(duì)事務(wù)支持情況
MyISAM強(qiáng)調(diào)的是性能,每次查詢具有原子性,其執(zhí)行速度比Innodb類型更快,但是不提供事務(wù)支持。
可以和其他字段一起建立聯(lián)合索引。引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引,自動(dòng)增長(zhǎng)可以不是第一列,他可以根據(jù)前面幾列進(jìn)行排序后遞增。
四、對(duì)鎖支持
只支持表級(jí)鎖,用戶在操作myisam表時(shí),select,update,delete,insert語(yǔ)句都會(huì)給表自動(dòng)加鎖,如果加鎖以后的表滿足insert并發(fā)的情況下,可以在表的尾部插入新的數(shù)據(jù)。
五、表行數(shù)
保存有表的總行數(shù),如果select count(*) from table;會(huì)直接取出出該值。
為什么MyISAM會(huì)比Innodb 的查詢速度快
INNODB在做查詢的時(shí)候,要維護(hù)的東西比MYISAM引擎多
1)INNODB要緩存數(shù)據(jù)塊,MYISAM只緩存索引塊, 這中間還有換進(jìn)換出的減少;
2)innodb尋址要映射到塊,再到行,MYISAM 記錄的直接是文件的OFFSET,定位比INNODB要快
3)INNODB還需要維護(hù)MVCC一致;雖然你的場(chǎng)景沒(méi)有,但他還是需要去檢查和維護(hù)
應(yīng)用場(chǎng)景選擇
MyISAM適合: (1)做很多count 的計(jì)算; (2)插入不頻繁,查詢非常頻繁; (3)沒(méi)有事務(wù)。 InnoDB適合: (1)可靠性要求比較高,或者要求事務(wù); (2)表更新和查詢都相當(dāng)?shù)念l繁,并且行鎖定的機(jī)會(huì)比較大的情況。總結(jié)
以上是生活随笔為你收集整理的MySql------存储引擎(InnoDB,ISAM)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Vue中img的动态src不显示图片
- 下一篇: en开头的单词_大道至简:为什么记英语单