本來這篇文檔只想寫Myisam和Innodb兩個存儲引擎的區(qū)別,畢竟這個話題也是面試中經(jīng)常被問到的。但,Myisam存儲引擎由于不支持事務(wù)以及不支持行級鎖,用的人越來越少了。所以,干脆寫一寫MySQL常見的引擎吧。
什么是MySQL存儲引擎
所謂存儲,就是存數(shù)據(jù)的介質(zhì),而存儲引擎就是一種存儲數(shù)據(jù)的方式,就好比磁盤里的文件系統(tǒng)。不同的存儲引擎,存儲數(shù)據(jù)的方式不同,實現(xiàn)的功能點也不同。MySQL8.0默認(rèn)的存儲引擎為Innodb。
MySQL存儲引擎都有哪些
在MySQL8里,可以執(zhí)行show engines;來查看所有支持的存儲引擎。
查看某個表是什么存儲引擎:
不同的存儲引擎都有各自的特點,以適應(yīng)不同的需求,我只針對下面3個常見的存儲引擎做出對比,如下表所示:
MyISAM存儲引擎
在MySQL5.5之前的版本,默認(rèn)使用該存儲引擎。若使用該存儲引擎,每個表會在磁盤上存儲成三個文件:
frm文件:存儲表的定義數(shù)據(jù)
MYD文件:存放表具體記錄的數(shù)據(jù)
MYI文件:存儲索引
Frm和MYI可以存放在不同的目錄下。MYI文件用來存儲索引,但僅保存記錄所在頁的指針,索引的結(jié)構(gòu)是B+樹結(jié)構(gòu)。
支持?jǐn)?shù)據(jù)的類型也有三種:
1)靜態(tài)固定長度表
這種方式的優(yōu)點在于存儲速度非??欤菀装l(fā)生緩存,而且表發(fā)生損壞后也容易修復(fù)。缺點是占空間。這也是默認(rèn)的存儲格式。
2)動態(tài)可變長表
優(yōu)點是節(jié)省空間,但是一旦出錯恢復(fù)起來比較麻煩。
3)壓縮表
上面說到支持?jǐn)?shù)據(jù)壓縮,說明肯定也支持這個格式。在數(shù)據(jù)文件發(fā)生錯誤時候,可以使用check table工具來檢查,而且還可以使用repair table工具來恢復(fù)。
MyISAM存儲引擎有一個重要的特點那就是不支持事務(wù),但是這也意味著它的存儲速度更快,如果你的讀寫操作允許有錯誤數(shù)據(jù)的話,只是追求速度,可以選擇這個存儲引擎。
InnoDB存儲引擎
InnoDB是MySQL8.0版本默認(rèn)的數(shù)據(jù)庫存儲引擎,他的主要特點有:
可以通過自動增長列,方法是auto_increment。
支持事務(wù)。默認(rèn)的事務(wù)隔離級別為可重復(fù)度,通過MVCC(并發(fā)版本控制)來實現(xiàn)的。
使用的鎖粒度為行級鎖,可以支持更高的并發(fā);
支持外鍵約束;外鍵約束其實降低了表的查詢速度,但是增加了表之間的耦合度。
配合一些熱備工具可以支持在線熱備份;
在InnoDB中存在著緩沖管理,通過緩沖池,將索引和數(shù)據(jù)全部緩存起來,加快查詢的速度;
對于InnoDB類型的表,其數(shù)據(jù)的物理組織形式是聚簇表。所有的數(shù)據(jù)按照主鍵來組織。數(shù)據(jù)和索引放在一塊,都位于B+數(shù)的葉子節(jié)點上;
當(dāng)然InnoDB的存儲表和索引也有下面兩種形式:
使用共享表空間存儲:所有的表和索引存放在同一個表空間中。
使用多表空間存儲:表結(jié)構(gòu)放在frm文件,數(shù)據(jù)和索引放在IBD文件中。分區(qū)表的話,每個分區(qū)對應(yīng)單獨的IBD文件,分區(qū)表的定義可以查看我的其他文章。使用分區(qū)表的好處在于提升查詢效率。
對于InnoDB來說,最大的特點在于支持事務(wù)。但是這是以損失效率來換取的。
Memory存儲引擎
將數(shù)據(jù)存在內(nèi)存,為了提高數(shù)據(jù)的訪問速度,每一個表實際上和一個磁盤文件關(guān)聯(lián)。文件是frm。Memroy存儲引擎主要有以下特點:
支持的數(shù)據(jù)類型有限制,比如:不支持TEXT和BLOB類型,對于字符串類型的數(shù)據(jù),只支持固定長度的行,VARCHAR會被自動存儲為CHAR類型;
支持的鎖粒度為表級鎖。所以,在訪問量比較大時,表級鎖會成為MEMORY存儲引擎的瓶頸;
由于數(shù)據(jù)是存放在內(nèi)存中,一旦服務(wù)器出現(xiàn)故障,數(shù)據(jù)都會丟失;
查詢的時候,如果有用到臨時表,而且臨時表中有BLOB,TEXT類型的字段,那么這個臨時表就會轉(zhuǎn)化為MyISAM類型的表,性能會急劇降低;
默認(rèn)使用hash索引。
如果一個內(nèi)部表很大,會轉(zhuǎn)化為磁盤表。
MyISAM對比Innodb
再來做一個總結(jié)吧,面試中被問到,可以簡單說說下面幾個要點:
存儲結(jié)構(gòu)
MyISAM:每個MyISAM在磁盤上存儲成三個文件。分別為:表定義文件、數(shù)據(jù)文件、索引文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數(shù)據(jù)文件的擴展名為.MYD (MYData)。索引文件的擴展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一個數(shù)據(jù)文件中(也可能是多個文件,或者是獨立的表空間文件),InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB
存儲空間
MyISAM支持支持三種不同的存儲格式:靜態(tài)表(默認(rèn),但是注意數(shù)據(jù)末尾不能有空格,會被去掉)、動態(tài)表、壓縮表。當(dāng)表在創(chuàng)建之后并導(dǎo)入數(shù)據(jù)之后,不會再進行修改操作,可以使用壓縮表,極大的減少磁盤的空間占用。
InnoDB需要更多的內(nèi)存和存儲,它會在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。
可移植性、備份及恢復(fù)
MyISAM:數(shù)據(jù)是以文件的形式存儲,所以在跨平臺的數(shù)據(jù)轉(zhuǎn)移中會很方便。在備份和恢復(fù)時可單獨針對某個表進行操作。
InnoDB:免費的方案可以是拷貝數(shù)據(jù)文件、備份 binlog,或者用mysqldump,在數(shù)據(jù)量達到幾十G的時候就相對痛苦了。
事務(wù)支持
MyISAM:強調(diào)的是性能,每次查詢具有原子性,其執(zhí)行速度比InnoDB類型更快,但是不提供事務(wù)支持。
InnoDB:提供事務(wù)支持、外部鍵等高級數(shù)據(jù)庫功能。
是否支持行級鎖
MyISAM:只支持表級鎖,用戶在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以后的表滿足insert并發(fā)的情況下,可以在表的尾部插入新的數(shù)據(jù)。
InnoDB:支持事務(wù)和行級鎖,是Innodb的最大特色。行鎖大幅度提高了多用戶并發(fā)操作的性能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的。
是否支持聚集索引
MyISAM不支持聚集索引,InnoDB支持聚集索引。
外鍵
MyISAM:不支持
InnoDB:支持
全文索引
MyISAM支持 FULLTEXT類型的全文索引。
InnoDB不支持FULLTEXT類型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
表主鍵
MyISAM允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
對于InnoDB,如果沒有設(shè)定主鍵或者非空唯一索引,就會自動生成一個6字節(jié)的主鍵(用戶不可見)。
表的行數(shù)
MyISAM保存有表的總行數(shù),如果select count() from table;會直接取出出該值。
InnoDB沒有保存表的總行數(shù),如果使用select count() from table;就會遍歷整個表,消耗相當(dāng)大,但是在加了where條件后,MyISAM和InnoDB處理的方式都一樣。
審核編輯:劉清
-
SAM
+關(guān)注
關(guān)注
0文章
112瀏覽量
33545 -
MySQL
+關(guān)注
關(guān)注
1文章
817瀏覽量
26622 -
Hash
+關(guān)注
關(guān)注
0文章
32瀏覽量
13211 -
MVCC
+關(guān)注
關(guān)注
0文章
13瀏覽量
1481
原文標(biāo)題:來聊聊MySQL的存儲引擎
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論