MyISAM:MyISAM是MySQL的ISAM擴展格式和缺省的數(shù)據(jù)庫引擎钝侠。除了提供ISAM里所沒有的索引和字段管理的大量功能目派,MyISAM還使用一種表格鎖定的機制略荡,來優(yōu)化多個并發(fā)的讀寫操作夏哭,其代價是你需要經(jīng)常運行OPTIMIZE TABLE命令,來恢復(fù)被更新機制所浪費的空間服球。MyISAM還有一些有用的擴展茴恰,例如用來修復(fù)數(shù)據(jù)庫文件的MyISAMCHK工具和用來恢復(fù)浪費空間的 MyISAMPACK工具。MYISAM強調(diào)了快速讀取操作斩熊,這可能就是為什么MySQL受到了WEB開發(fā)如此青睞的主要原因:在WEB開發(fā)中你所進行的大量數(shù)據(jù)操作都是讀取操作往枣。所以,大多數(shù)虛擬主機提供商和INTERNET平臺提供商只允許使用MYISAM格式粉渠。MyISAM格式的一個重要缺陷就是不能在表損壞后恢復(fù)數(shù)據(jù)分冈。
InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型,這兩個表類型各有優(yōu)劣霸株,視具體應(yīng) 用而定雕沉。
基本的差別為:MyISAM類型不支持事務(wù)處理等高級處理,
而InnoDB類型支持去件。MyISAM類型的 表強調(diào)的是性能坡椒,其執(zhí)行數(shù)度比InnoDB類型更快扰路,
但是不提供事務(wù)支持,而InnoDB提供事務(wù)支持已經(jīng)外 部鍵等高級數(shù)據(jù)庫功能倔叼。
一.InnoDB存儲引擎
InnoDB給MySQL的表提供了事務(wù)處理汗唱、回滾、崩潰修復(fù)能力和多版本并發(fā)控制的事務(wù)安全缀雳。
在MySQL從3.23.34a開始包含InnnoDB渡嚣。它是MySQL上第一個提供外鍵約束的表引擎。
而且InnoDB對事務(wù)處理的能力肥印,也是其他存儲引擎不能比擬的【希靠后版本的MySQL的默認(rèn)存儲引擎就是InnoDB深碱。
InnoDB存儲引擎總支持AUTO_INCREMENT。自動增長列的值不能為空藏畅,并且值必須唯一敷硅。
MySQL中規(guī)定自增列必須為主鍵。在插入值的時候愉阎,如果自動增長列不輸入值绞蹦,
則插入的值為自動增長后的值;如果輸入的值為0或空(NULL)榜旦,則插入的值也是自動增長后的值幽七;
如果插入某個確定的值,且該值在前面沒有出現(xiàn)過溅呢,就可以直接插入澡屡。
InnoDB還支持外鍵(FOREIGN KEY)。外鍵所在的表叫做子表咐旧,外鍵所依賴(REFERENCES)的表叫做父表驶鹉。
父表中被字表外鍵關(guān)聯(lián)的字段必須為主鍵。當(dāng)刪除铣墨、更新父表中的某條信息時室埋,子表也必須有相應(yīng)的改變,這是數(shù)據(jù)庫的參照完整性規(guī)則伊约。
InnoDB中姚淆,創(chuàng)建的表的表結(jié)構(gòu)存儲在.frm文件中(我覺得是frame的縮寫吧)。
數(shù)據(jù)和索引存儲在innodb_data_home_dir和innodb_data_file_path定義的表空間中碱妆。
InnoDB的優(yōu)勢在于提供了良好的事務(wù)處理肉盹、崩潰修復(fù)能力和并發(fā)控制。缺點是讀寫效率較差疹尾,占用的數(shù)據(jù)空間相對較大上忍。
二.MyISAM存儲引擎
MyISAM是MySQL中常見的存儲引擎骤肛,曾經(jīng)是MySQL的默認(rèn)存儲引擎。MyISAM是基于ISAM引擎發(fā)展起來的窍蓝,增加了許多有用的擴展腋颠。
MyISAM的表存儲成3個文件。文件的名字與表名相同吓笙。拓展名為frm淑玫、MYD、MYI面睛。其實絮蒿,frm文件存儲表的結(jié)構(gòu);
MYD文件存儲數(shù)據(jù)叁鉴,是MYData的縮寫土涝;MYI文件存儲索引,是MYIndex的縮寫幌墓。
基于MyISAM存儲引擎的表支持3種不同的存儲格式但壮。包括靜態(tài)型、動態(tài)型和壓縮型常侣。
其中蜡饵,靜態(tài)型是MyISAM的默認(rèn)存儲格式,它的字段是固定長度的胳施;動態(tài)型包含變長字段溯祸,記錄的長度不是固定的;
壓縮型需要用到myisampack工具巾乳,占用的磁盤空間較小您没。
MyISAM的優(yōu)勢在于占用空間小,處理速度快胆绊。缺點是不支持事務(wù)的完整性和并發(fā)性氨鹏。
三.MEMORY存儲引擎
MEMORY是MySQL中一類特殊的存儲引擎。它使用存儲在內(nèi)存中的內(nèi)容來創(chuàng)建表压状,而且數(shù)據(jù)全部放在內(nèi)存中仆抵。這些特性與前面的兩個很不同。
每個基于MEMORY存儲引擎的表實際對應(yīng)一個磁盤文件种冬。該文件的文件名與表名相同镣丑,類型為frm類型。該文件中只存儲表的結(jié)構(gòu)娱两。
而其數(shù)據(jù)文件莺匠,都是存儲在內(nèi)存中,這樣有利于數(shù)據(jù)的快速處理十兢,提高整個表的效率趣竣。
值得注意的是摇庙,服務(wù)器需要有足夠的內(nèi)存來維持MEMORY存儲引擎的表的使用。
如果不需要了遥缕,可以釋放內(nèi)存卫袒,甚至刪除不需要的表。
MEMORY默認(rèn)使用哈希索引单匣。速度比使用B型樹索引快夕凝。當(dāng)然如果你想用B型樹索引,可以在創(chuàng)建索引時指定户秤。
注意码秉,MEMORY用到的很少,因為它是把數(shù)據(jù)存到內(nèi)存中虎忌,如果內(nèi)存出現(xiàn)異常就會影響數(shù)據(jù)泡徙。
如果重啟或者關(guān)機,所有數(shù)據(jù)都會消失膜蠢。因此,基于MEMORY的表的生命周期很短莉兰,一般是一次性的挑围。
以下是一些細(xì)節(jié)和具體實現(xiàn)的差別:
1.InnoDB不支持FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數(shù)糖荒,也就是說杉辙,執(zhí)行select count(*) fromtable時,InnoDB要掃描一遍整,
個表來計算有多少行捶朵,但是MyISAM只要簡單的讀出保存好的行數(shù)即可注意的是蜘矢,當(dāng)count(*)語句包含where條件時,兩種表的操作是一樣的综看。
3.對于AUTO_INCREMENT類型的字段品腹,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中红碑,可以和其他字段一起建立聯(lián)合索引舞吭。
4.DELETE FROM table時,InnoDB不會重新建立表析珊,而是一行一行的刪除羡鸥。
5.LOAD TABLE FROMMASTER操作對InnoDB是不起作用的,
解決方法是首先把InnoDB表改成MyISAM表忠寻,導(dǎo)入數(shù)據(jù)后再改成InnoDB表惧浴,但是對于使用的額外的 InnoDB特性(例如外鍵)的表不適用。
另外奕剃,InnoDB表的行鎖也不是絕對的衷旅,假如在執(zhí)行一個SQL語句時MySQL不能確定要掃描的范圍捐腿,
InnoDB表同樣會鎖全表,例如updatetable set num=1 where name like “a%”
兩種類型最主要的差別就是Innodb支持事務(wù)處理與外鍵和行級鎖.而MyISAM不支持.所以MyISAM往往就 容易被人認(rèn)為只適合在小項目中使用芜茵。
我作為使用MySQL的用戶角度出發(fā)叙量,Innodb和MyISAM都是比較喜歡的,
但是從我目前運維的數(shù)據(jù)庫平臺要達(dá)到需求:99.9%的穩(wěn)定性九串,方便的擴展性和高可用性來說的話绞佩,MyISAM絕對是我的首選。