1. 存儲(chǔ)引擎相關(guān)介紹
存儲(chǔ)引擎在 MySQL
的體系架構(gòu)中位于第三層,負(fù)責(zé) MySQL
中的數(shù)據(jù)的存儲(chǔ)和提取聚谁,是與文件打交道的子系統(tǒng)搪搏,它是根據(jù) MySQL
提供的文件訪問層抽象接口定制的一種文件訪問機(jī)制馍乙,這種機(jī)制就叫作存儲(chǔ)引擎。
-- 查看當(dāng)前數(shù)據(jù)庫支持的引擎信息
show engines;
在5.5 版本之前默認(rèn)采用 MyISAM
存儲(chǔ)引擎执虹,從5.5開始采用 InnoDB
存儲(chǔ)引擎。
-
Memory
:利用內(nèi)存創(chuàng)建表蒋畜,訪問速度非成罚快,因?yàn)閿?shù)據(jù)在內(nèi)存姻成,而且默認(rèn)使用Hash
索引插龄,但是一旦關(guān)閉,數(shù)據(jù)就會(huì)丟失科展。 -
MRG_MyISAM
:一組MyISAM
表的組合均牢,這些MyISAM
表必須結(jié)構(gòu)相同,Merge
表本身沒有數(shù)據(jù)才睹, 對Merge
操作可以對一組MyISAM
表進(jìn)行操作徘跪。 -
CSV
:以CSV
文件進(jìn)行數(shù)據(jù)存儲(chǔ),由于文件限制琅攘,所有列必須強(qiáng)制指定not null
垮庐,另外CSV引擎也不 支持索引和分區(qū),適合做數(shù)據(jù)交換的中間表坞琴。 -
Federated
:可以訪問遠(yuǎn)端MySQL
數(shù)據(jù)庫中的表哨查。一個(gè)本地表,不保存數(shù)據(jù)剧辐,訪問遠(yuǎn)程表內(nèi)容寒亥。 -
MyISAM
:不支持事務(wù)和外鍵邮府,訪問速度快。 -
InnoDB
:支持事務(wù)溉奕,具有提交褂傀,回滾和崩潰恢復(fù)能力,事務(wù)安全加勤。 -
BlackHole
: 黑洞仙辟,只進(jìn)不出,進(jìn)來消失鳄梅,所有插入數(shù)據(jù)都不會(huì)保存欺嗤。 -
Archive
:歸檔類型引擎,僅能支持insert
和select
語句卫枝。
2. InnoDB 和 MyISAM 對比
InnoDB
和 MyISAM
是使用 MySQL
是常用的兩種引擎類型
2.1 事務(wù)和外鍵
-
InnoDB
支持事務(wù)和外鍵煎饼,具有安全性和完整性,適合大量insert
或update
操作 -
MyISAM
不支持事務(wù)和外鍵校赤,它提供高速存儲(chǔ)和檢索吆玖,適合大量的select
查詢操作
2.2 鎖機(jī)制
-
InnoDB
支持行級(jí)鎖,鎖定指定記錄马篮≌闯耍基于索引來加鎖實(shí)現(xiàn)。 -
MyISAM
支持表級(jí)鎖浑测,鎖定整張表翅阵。
2.3 索引結(jié)構(gòu)
-
InnoDB
使用聚集索引(聚簇索引),索引和記錄在一起存儲(chǔ)迁央,既緩存索引掷匠,也緩存記錄。 -
MyISAM
使用非聚集索引(非聚簇索引)岖圈,索引和記錄分開讹语。
2.4 并發(fā)處理能力
-
MyISAM
使用表鎖,會(huì)導(dǎo)致寫操作并發(fā)率低蜂科,讀之間并不阻塞顽决,讀寫阻塞。 -
InnoDB
讀寫阻塞可以與隔離級(jí)別有關(guān)导匣,可以采用多版本并發(fā)控制(MVCC
)來支持高并發(fā)
2.5 存儲(chǔ)文件
-
InnoDB
表對應(yīng)兩個(gè)文件才菠,一個(gè).frm
表結(jié)構(gòu)文件,一個(gè).ibd
數(shù)據(jù)文件贡定。InnoDB
表大支持64TB
赋访; -
MyISAM
表對應(yīng)三個(gè)文件,一個(gè).frm
表結(jié)構(gòu)文件,一個(gè)MYD
表數(shù)據(jù)文件进每,一個(gè).MYI
索引文件。從MySQL5.0
開始默認(rèn)限制是256TB
命斧。
2.6 適用場景
2.6.1 MyISAM
- 不需要事務(wù)支持(不支持)
- 并發(fā)相對較低(鎖定機(jī)制問題)
- 數(shù)據(jù)修改相對較少田晚,以讀為主
- 數(shù)據(jù)一致性要求不高
2.6.2 InnoDB
- 需要事務(wù)支持(具有較好的事務(wù)特性)
- 行級(jí)鎖定對高并發(fā)有很好的適應(yīng)能力
- 數(shù)據(jù)更新較為頻繁的場景
- 數(shù)據(jù)一致性要求較高
- 硬件設(shè)備內(nèi)存較大,可以利用
InnoDB
較好的緩存能力來提高內(nèi)存利用率国葬,減少磁盤IO
2.6.3 總結(jié)
兩種引擎該如何選擇贤徒?
是否需要事務(wù)?有汇四,InnoDB
是否存在并發(fā)修改接奈?有,InnoDB
是否追求快速查詢通孽,且數(shù)據(jù)修改少序宦?是,MyISAM
在絕大多數(shù)情況下背苦,推薦使用 InnoDB