1.ISAM
該引擎在讀取數(shù)據(jù)方面速度很快梗摇,而且不占用大量的內(nèi)存和存儲資源毁兆;但是ISAM不支持事務(wù)處理、不支持外來鍵茶行、不能夠容錯(cuò)躯概、也不支持索引。該引擎在包括MySQL 5.1及其以上版本的數(shù)據(jù)庫中不再支持畔师。
2. MyISAM
該引擎基于ISAM數(shù)據(jù)庫引擎娶靡,除了提供ISAM里所沒有的索引和字段管理等大量功能,MyISAM支持表級鎖.缺點(diǎn)同上.
3.?HEAP(也稱為MEMORY)
該存儲引擎通過在內(nèi)存中創(chuàng)建臨時(shí)表來存儲數(shù)據(jù)茉唉。每個(gè)基于該存儲引擎的表實(shí)際對應(yīng)一個(gè)磁盤文件固蛾,該文件的文件名和表名是相同的结执,類型為.frm度陆。該磁盤文件只存儲表的結(jié)構(gòu)艾凯,而其數(shù)據(jù)存儲在內(nèi)存中,所以使用該種引擎的表擁有極高的插入懂傀、更新和查詢效率趾诗。這種存儲引擎默認(rèn)使用哈希(HASH)索引,其速度比使用B-+Tree型要快蹬蚁,但也可以使用B樹型索引恃泪。由于這種存儲引擎所存儲的數(shù)據(jù)保存在內(nèi)存中,所以其保存的數(shù)據(jù)具有不穩(wěn)定性犀斋,比如如果mysqld進(jìn)程發(fā)生異常贝乎、重啟或計(jì)算機(jī)關(guān)機(jī)等等都會造成這些數(shù)據(jù)的消失,所以這種存儲引擎中的表的生命周期很短叽粹,一般只使用一次览效。
4.CSV(Comma-Separated Values逗號分隔值)
使用該引擎的MySQL數(shù)據(jù)庫表會在MySQL安裝目錄data文件夾中的和該表所在數(shù)據(jù)庫名相同的目錄中生成一個(gè).CSV文件(所以,它可以將CSV類型的文件當(dāng)做表進(jìn)行處理)虫几,這種文件是一種普通文本文件锤灿,每個(gè)數(shù)據(jù)行占用一個(gè)文本行。該種類型的存儲引擎不支持索引辆脸,即使用該種類型的表沒有主鍵列但校;另外也不允許表中的字段為null。
5.BLACKHOLE(黑洞引擎)
該存儲引擎支持事務(wù)啡氢,而且支持mvcc的行級鎖状囱,寫入這種引擎表中的任何數(shù)據(jù)都會消失,主要用于做日志記錄或同步歸檔的中繼存儲倘是,這個(gè)存儲引擎除非有特別目的亭枷,否則不適合使用。(作為主從復(fù)制中的中繼重復(fù)器或在其上面添加過濾器機(jī)制,例如,假設(shè)你的應(yīng)用需要從服務(wù)器側(cè)的過濾規(guī)則辨绊,但傳輸所有二進(jìn)制日志數(shù)據(jù)到從服務(wù)器會導(dǎo)致較大的網(wǎng)絡(luò)流量奶栖。在這種情況下,在主服務(wù)器主機(jī)上建立一個(gè)偽從服務(wù)器進(jìn)程门坷。)
解釋:
主服務(wù)器的操作寫入二進(jìn)制日志,偽mysqld進(jìn)程作為從服務(wù)器宣鄙,在偽mysqld進(jìn)程上配置replicate-do和replicate-ignore規(guī)則,并且寫一個(gè)新的默蚌,被過濾的二進(jìn)制日志 冻晤。這個(gè)已過濾日志被提供給其他真正的從服務(wù)器。因?yàn)閭芜M(jìn)程不存儲任何數(shù)據(jù)绸吸,只消耗很小的額外的mysqld進(jìn)程資源鼻弧。這個(gè)類型的建立可以用額外復(fù)制從服務(wù)器來重復(fù)设江。
6.ARCHIVE
該存儲引擎非常適合存儲大量獨(dú)立的、作為歷史記錄的數(shù)據(jù)攘轩。區(qū)別于InnoDB和MyISAM這兩種引擎叉存,ARCHIVE提供了壓縮功能,擁有高效的插入速度度帮,但是這種引擎不支持索引歼捏,所以查詢性能較差一些。
7.??InnoDB
該存儲引擎為MySQL表提供了ACID事務(wù)支持笨篷、系統(tǒng)崩潰修復(fù)能力和多版本并發(fā)控制(即MVCC Multi-Version Concurrency Control)的行級鎖;該引擎支持自增長列(auto_increment),自增長列的值不能為空瞳秽,如果在使用的時(shí)候?yàn)榭談t自動(dòng)從現(xiàn)有值開始增值,如果有但是比現(xiàn)在的還大率翅,則直接保存這個(gè)值; 該引擎存儲引擎支持外鍵(foreign key) ,外鍵所在的表稱為子表而所依賴的表稱為父表练俐。該引擎在5.5后的MySQL數(shù)據(jù)庫中為默認(rèn)存儲引擎。
8.PERFORMANCE_SCHEMA
該引擎主要用于收集數(shù)據(jù)庫服務(wù)器性能參數(shù)冕臭。這種引擎提供以下功能:提供進(jìn)程等待的詳細(xì)信息腺晾,包括鎖、互斥變量浴韭、文件信息丘喻;保存歷史的事件匯總信息,為提供MySQL服務(wù)器性能做出詳細(xì)的判斷念颈;對于新增和刪除監(jiān)控事件點(diǎn)都非常容易泉粉,并可以隨意改變mysql服務(wù)器的監(jiān)控周期,例如(CYCLE榴芳、MICROSECOND)嗡靡。
9.?Berkeley(BDB)
該存儲引擎支持COMMIT和ROLLBACK等其他事務(wù)特性。該引擎在包括MySQL 5.1及其以上版本的數(shù)據(jù)庫中不再支持窟感。
10.Merge
該引擎將一定數(shù)量的MyISAM表聯(lián)合而成一個(gè)整體讨彼。
11.??Cluster/NDB
該存儲引擎用于多臺數(shù)據(jù)機(jī)器聯(lián)合提供服務(wù)以提高整體性能和安全性。適合數(shù)據(jù)量大柿祈、安全和性能要求高的場景哈误。
MySQL 存儲引擎(MyISAM、InnoDB躏嚎、NDBCluster)
MyISAM
1.特性
不支持事務(wù):MyISAM存儲引擎不支持事務(wù)蜜自,所以對事務(wù)有要求的業(yè)務(wù)場景不能使用
表級鎖定:其鎖定機(jī)制是表級索引,這雖然可以讓鎖定的實(shí)現(xiàn)成本很小但是也同時(shí)大大降低了其并發(fā)性能
讀寫互相阻塞:不僅會在寫入的時(shí)候阻塞讀取卢佣,MyISAM還會在讀取的時(shí)候阻塞寫入重荠,但讀本身并不會阻塞另外的讀
只會緩存索引:MyISAM可以通過key_buffer緩存以大大提高訪問性能減少磁盤IO,但是這個(gè)緩存區(qū)只會緩存索引虚茶,而不會緩存數(shù)據(jù)
2.適用場景
不需要事務(wù)支持(不支持)
并發(fā)相對較低(鎖定機(jī)制問題)
數(shù)據(jù)修改相對較少(阻塞問題)
以讀為主
數(shù)據(jù)一致性要求不是非常高
3.最佳實(shí)踐
盡量索引(緩存機(jī)制)
調(diào)整讀寫優(yōu)先級戈鲁,根據(jù)實(shí)際需求確保重要操作更優(yōu)先
啟用延遲插入改善大批量寫入性能
盡量順序操作讓insert數(shù)據(jù)都寫入到尾部仇参,減少阻塞
分解大的操作,降低單個(gè)操作的阻塞時(shí)間
降低并發(fā)數(shù)婆殿,某些高并發(fā)場景通過應(yīng)用來進(jìn)行排隊(duì)機(jī)制
對于相對靜態(tài)的數(shù)據(jù)诈乒,充分利用Query Cache可以極大的提高訪問效率
MyISAM的Count只有在全表掃描的時(shí)候特別高效,帶有其他條件的count都需要進(jìn)行實(shí)際的數(shù)據(jù)訪問
InnoDB
1.特性
具有較好的事務(wù)支持:支持4個(gè)事務(wù)隔離級別鸣皂,支持多版本讀
行級鎖定:通過索引實(shí)現(xiàn)抓谴,全表掃描仍然會是表鎖暮蹂,注意間隙鎖的影響
讀寫阻塞與事務(wù)隔離級別相關(guān)
具有非常高效的緩存特性:能緩存索引寞缝,也能緩存數(shù)據(jù)
整個(gè)表和主鍵以Cluster方式存儲,組成一顆平衡樹
所有Secondary Index都會保存主鍵信息
2.適用場景
需要事務(wù)支持(具有較好的事務(wù)特性)
行級鎖定對高并發(fā)有很好的適應(yīng)能力仰泻,但需要確保查詢是通過索引完成
數(shù)據(jù)更新較為頻繁的場景
數(shù)據(jù)一致性要求較高
硬件設(shè)備內(nèi)存較大荆陆,可以利用InnoDB較好的緩存能力來提高內(nèi)存利用率,盡可能減少磁盤 IO
3.最佳實(shí)踐
主鍵盡可能小集侯,避免給Secondary index帶來過大的空間負(fù)擔(dān)
避免全表掃描被啼,因?yàn)闀褂帽礞i
盡可能緩存所有的索引和數(shù)據(jù),提高響應(yīng)速度
在大批量小插入的時(shí)候棠枉,盡量自己控制事務(wù)而不要使用autocommit自動(dòng)提交
合理設(shè)置innodb_flush_log_at_trx_commit參數(shù)值浓体,不要過度追求安全性
避免主鍵更新,因?yàn)檫@會帶來大量的數(shù)據(jù)移動(dòng)
NDBCluster
1.特性
分布式:分布式存儲引擎辈讶,可以由多個(gè)NDBCluster存儲引擎組成集群分別存放整體數(shù)據(jù)的一部分
支持事務(wù):和Innodb一樣命浴,支持事務(wù)
可與mysqld不在一臺主機(jī):可以和mysqld分開存在于獨(dú)立的主機(jī)上,然后通過網(wǎng)絡(luò)和mysqld通信交互
內(nèi)存需求量巨大:新版本索引以及被索引的數(shù)據(jù)必須存放在內(nèi)存中贱除,老版本所有數(shù)據(jù)和索引必須存在與內(nèi)存中
2.適用場景
具有非常高的并發(fā)需求
對單個(gè)請求的響應(yīng)并不是非常的critical
查詢簡單生闲,過濾條件較為固定,每次請求數(shù)據(jù)量較少月幌,又不希望自己進(jìn)行水平Sharding
3.最佳實(shí)踐
盡可能讓查詢簡單碍讯,避免數(shù)據(jù)的跨節(jié)點(diǎn)傳輸
盡可能滿足SQL節(jié)點(diǎn)的計(jì)算性能,大一點(diǎn)的集群SQL節(jié)點(diǎn)會明顯多余Data節(jié)點(diǎn)
在各節(jié)點(diǎn)之間盡可能使用萬兆網(wǎng)絡(luò)環(huán)境互聯(lián)扯躺,以減少數(shù)據(jù)在網(wǎng)絡(luò)層傳輸過程中的延時(shí)
4. 它的限制
4.1 不支持臨時(shí)表捉兴。
4.2 不支持基于TEXT and BLOB 字段的索引。