InnoDB和MyISAM都是mysql數(shù)據(jù)庫中常見的存儲引擎,它們各有特點:
InnoDB
- 事務(wù)支持:InnoDB 是支持事務(wù)的存儲引擎,可以使用提交(commit)和回滾(rollback)來保證數(shù)據(jù)的完整性。
- 行級鎖定:InnoDB 使用行級鎖定(row-level locking),這意味著在操作數(shù)據(jù)時只會鎖定需要修改的行,而不是整個表,有助于提高并發(fā)性能。
- 外鍵約束:InnoDB 支持外鍵約束,可以確保數(shù)據(jù)的完整性,保證參照完整性。
- 崩潰恢復(fù):InnoDB 提供了崩潰恢復(fù)功能,可以自動進行恢復(fù),保證數(shù)據(jù)的一致性。
MyISAM
- 全文搜索:MyISAM 對全文搜索功能支持較好,適合用于需要頻繁進行全文搜索的場景。
- 表級鎖定:MyISAM 使用表級鎖定(table-level locking),這意味著在操作數(shù)據(jù)時會鎖定整個表,可能導(dǎo)致并發(fā)性能較差。
- 不支持事務(wù):MyISAM 不支持事務(wù)處理,因此無法使用提交和回滾等操作來維護數(shù)據(jù)的完整性。
- 不支持外鍵:MyISAM 不支持外鍵約束,需要在應(yīng)用層面去維護數(shù)據(jù)的一致性。
選擇存儲引擎取決于具體的業(yè)務(wù)需求。如果需要事務(wù)支持、行級鎖定和數(shù)據(jù)完整性,通常會選擇InnoDB。
如果對全文搜索有很高的要求,并且不需要事務(wù)支持,可以選擇MyISAM。
在實際應(yīng)用中,也可以根據(jù)具體的場景靈活選擇不同的存儲引擎以獲得最佳性能。
mysql innodb和myisam對和適用場景
InnoDB和MyISAM對比
1)事務(wù)和外鍵
2)鎖機制
- InnoDB支持行級鎖,鎖定指定記錄。基于索引來加鎖實現(xiàn)
- MyISAM支持表級鎖,鎖定整張表
3)索引結(jié)構(gòu)
- InnoDB使用聚集索引(聚簇索引),索引和記錄在一起存儲,既緩存索引,也緩存記錄
- MyISAM使用非聚集索引(非聚簇索引),索引和記錄分開
4)并發(fā)處理能力
- MyISAM使用表鎖,會導(dǎo)致寫操作并發(fā)率低,讀之間并不阻塞,讀寫阻塞
- InnoDB讀寫阻塞可以與隔離級別有關(guān),可以采用多版本并發(fā)控制(mvcC)來支持高并發(fā)
5)存儲文件
- InnoDB表對應(yīng)兩個文件,一個.frm表結(jié)構(gòu)文件,一個.ibd數(shù)據(jù)文件, InnoDB表最大支持64TB
- MyISAM表對應(yīng)三個文件,一個.frm表結(jié)構(gòu)文件,一個MYD表數(shù)據(jù)文件,一個.MYI索引文件。從 mysql5.0開始默認限制是256TB
適用場景
1)MyISAM
- 不需要事務(wù)支持(不支持)
- 并發(fā)相對較低(鎖定機制問題)
- 數(shù)據(jù)修改相對較少,以讀為主
- 數(shù)據(jù)一致性要求不高
2)InnoDB
- 需要事務(wù)支持(具有較好的事務(wù)特性)
- 行級鎖定對高并發(fā)有很好的適應(yīng)能力
- 數(shù)據(jù)更新較為頻繁的場景
- 數(shù)據(jù)一致性要求較高
- 硬件設(shè)備內(nèi)存較大,可以利用InnoDB較好的緩存能力來提高內(nèi)存利用率,減少磁盤IO