MySQL數(shù) 據(jù)庫(kù)引擎取決于MySQL在安裝的時(shí)候是如何被編譯的侠畔。要添加一個(gè)新的引擎冰单,就必須重新編譯MYSQL岸军。在缺省情況下肖抱,MYSQL支持三個(gè)引擎:ISAM备典、MYISAM和HEAP。另外兩種類(lèi)型INNODB和BERKLEY(BDB)意述,也常程嵊叮可以使用。如果技術(shù)高超荤崇,還可以使用MySQL++ API自己做一個(gè)引擎拌屏。下面介紹幾種數(shù)據(jù)庫(kù)引擎:
ISAM:ISAM是一個(gè)定義明確且歷經(jīng)時(shí)間考驗(yàn)的數(shù)據(jù)表格管理方法,它在設(shè)計(jì)之時(shí)就考慮到 數(shù)據(jù)庫(kù)被查詢(xún)的次數(shù)要遠(yuǎn)大于更新的次數(shù)术荤。因此倚喂,ISAM執(zhí)行讀取操作的速度很快,而且不占用大量的內(nèi)存和存儲(chǔ)資源喜每。ISAM的兩個(gè)主要不足之處在于务唐,它不 支持事務(wù)處理,也不能夠容錯(cuò):如果你的硬盤(pán)崩潰了带兜,那么數(shù)據(jù)文件就無(wú)法恢復(fù)了枫笛。如果你正在把ISAM用在關(guān)鍵任務(wù)應(yīng)用程序里,那就必須經(jīng)常備份你所有的實(shí) 時(shí)數(shù)據(jù)刚照,通過(guò)其復(fù)制特性刑巧,MYSQL能夠支持這樣的備份應(yīng)用程序。
MyISAM:MyISAM是MySQL的ISAM擴(kuò)展格式和缺省的數(shù)據(jù)庫(kù)引擎。除了提供ISAM里所沒(méi)有的索引和字段管理的大量功能啊楚,MyISAM還使用一種表格鎖定的機(jī)制吠冤,來(lái)優(yōu)化多個(gè)并發(fā)的讀寫(xiě)操作,其代價(jià)是你需要經(jīng)常運(yùn)行OPTIMIZE TABLE命令恭理,來(lái)恢復(fù)被更新機(jī)制所浪費(fèi)的空間拯辙。MyISAM還有一些有用的擴(kuò)展,例如用來(lái)修復(fù)數(shù)據(jù)庫(kù)文件的MyISAMCHK工具和用來(lái)恢復(fù)浪費(fèi)空間的 MyISAMPACK工具颜价。MYISAM強(qiáng)調(diào)了快速讀取操作涯保,這可能就是為什么MySQL受到了WEB開(kāi)發(fā)如此青睞的主要原因:在WEB開(kāi)發(fā)中你所進(jìn)行的大量數(shù)據(jù)操作都是讀取操作。所以周伦,大多數(shù)虛擬主機(jī)提供商和INTERNET平臺(tái)提供商只允許使用MYISAM格式夕春。MyISAM格式的一個(gè)重要缺陷就是不能在表?yè)p壞后恢復(fù)數(shù)據(jù)。
HEAP:HEAP允許只駐留在內(nèi)存里的臨時(shí)表格专挪。駐留在內(nèi)存里讓HEAP要比ISAM和MYISAM都快及志,但是它所管理的數(shù)據(jù)是不穩(wěn)定的,而且如果在關(guān)機(jī)之前沒(méi)有進(jìn)行保存寨腔,那么所有的數(shù)據(jù)都會(huì)丟失速侈。在數(shù)據(jù)行被刪除的時(shí)候,HEAP也不會(huì)浪費(fèi)大量的空間脆侮。HEAP表格在你需要使用SELECT表達(dá)式來(lái)選擇和操控?cái)?shù)據(jù)的時(shí)候非常有用锌畸。要記住勇劣,在用完表格之后就刪除表格靖避。
InnoDB:InnoDB數(shù)據(jù)庫(kù)引擎都是造就MySQL靈活性的技術(shù)的直接產(chǎn)品,這項(xiàng)技術(shù)就是MYSQL++ API比默。在使用MYSQL的時(shí)候幻捏,你所面對(duì)的每一個(gè)挑戰(zhàn)幾乎都源于ISAM和MyISAM數(shù)據(jù)庫(kù)引擎不支持事務(wù)處理(transaction process)也不支持外來(lái)鍵。盡管要比ISAM和 MyISAM引擎慢很多命咐,但是InnoDB包括了對(duì)事務(wù)處理和外來(lái)鍵的支持篡九,這兩點(diǎn)都是前兩個(gè)引擎所沒(méi)有的。如前所述醋奠,如果你的設(shè)計(jì)需要這些特性中的一者 或者兩者榛臼,那你就要被迫使用后兩個(gè)引擎中的一個(gè)了。
MySQL 官方對(duì)InnoDB是這樣解釋的:InnoDB給MySQL提供了具有提交窜司、回滾和崩潰恢復(fù)能力的事務(wù)安全(ACID兼容)存儲(chǔ)引擎沛善。InnoDB鎖定在行級(jí)并且也在SELECT語(yǔ)句提供一個(gè)Oracle風(fēng)格一致的非鎖定讀,這些特色增加了多用戶(hù)部署和性能塞祈。沒(méi)有在InnoDB中擴(kuò)大鎖定的需要金刁,因?yàn)樵贗nnoDB中行級(jí)鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強(qiáng)制。在SQL查詢(xún)中尤蛮,你可以自由地將InnoDB類(lèi)型的表與其它MySQL的表的類(lèi)型混合起來(lái)媳友,甚至在同一個(gè)查詢(xún)中也可以混合。
InnoDB是為處理巨大數(shù)據(jù)量時(shí)的最大性能設(shè)計(jì)产捞,它的CPU效率可能是任何其它基于磁盤(pán)的關(guān)系數(shù)據(jù)庫(kù)引擎所不能匹敵的醇锚。
InnoDB存儲(chǔ)引擎被完全與MySQL服務(wù)器整合,InnoDB存儲(chǔ)引擎為在主內(nèi)存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池坯临。InnoDB存儲(chǔ)它的表&索引在一個(gè)表空間中搂抒,表空間可以包含數(shù)個(gè)文件(或原始磁盤(pán)分區(qū))。這與MyISAM表不同尿扯,比如在MyISAM表中每個(gè)表被存在分離的文件中求晶。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統(tǒng)上衷笋。
InnoDB默認(rèn)地被包含在MySQL二進(jìn)制分發(fā)中芳杏。Windows Essentials installer使InnoDB成為Windows上MySQL的默認(rèn)表。
InnoDB被用來(lái)在眾多需要高性能的大型數(shù)據(jù)庫(kù)站點(diǎn)上產(chǎn)生辟宗。著名的Internet新聞?wù)军c(diǎn)Slashdot.org運(yùn)行在InnoDB上爵赵。 Mytrix, Inc.在InnoDB上存儲(chǔ)超過(guò)1TB的數(shù)據(jù),還有一些其它站點(diǎn)在InnoDB上處理平均每秒800次插入/更新的
一般來(lái)說(shuō)泊脐,MyISAM適合:(1)做很多count 的計(jì)算空幻;(2)插入不頻繁,查詢(xún)非常頻繁容客;(3)沒(méi)有事務(wù)秕铛。InnoDB適合:(1)可靠性要求比較高,或者要求事務(wù)缩挑;(2)表更新和查詢(xún)都相當(dāng)?shù)念l繁但两,并且表鎖定的機(jī)會(huì)比較大的情況。
一般情況下供置,MySQL會(huì)默認(rèn)提供多種存儲(chǔ)引擎谨湘,可以通過(guò)下面的查看:
(1)看你的MySQL現(xiàn)在已提供什么存儲(chǔ)引擎: mysql>show engines;
(2)看你的MySQL當(dāng)前默認(rèn)的存儲(chǔ)引擎: mysql>show variables like '%storage_engine%';
(3)你要看某個(gè)表用了什么引擎(在顯示結(jié)果里參數(shù)engine后面的就表示該表當(dāng)前用的存儲(chǔ)引擎): mysql>show create table 表名;
所有的性能測(cè)試在:Micrisoft window xp sp2 , Intel(R) Pentinum(R) M processor 1.6oGHz 1G 內(nèi)存的電腦上測(cè)試芥丧。
測(cè)試方法:連續(xù)提交10個(gè)query紧阔, 表記錄總數(shù):38萬(wàn) , 時(shí)間單位 s
引擎類(lèi)型????????????????? ? MyISAM ??????????? ?? InnoDB ???????????? 性能相差
count????????????????????? 0.0008357??????????? 3.0163??????????????? 3609
查詢(xún)主鍵????????????? ???? 0.005708?????????? ?? 0.1574????????????? ? 27.57
查詢(xún)非主鍵?????????? ?? ??? 24.01????????????? ???? 80.37???????????? ??? 3.348
更新主鍵???????????? ? ??? 0.008124???????????? 0.8183?????????????? ? 100.7
更新非主鍵??????????????? 0.004141???????????? 0.02625?????????????? 6.338
插入??????????????????? ? ?? 0.004188???????? ??? 0.3694???????????????? 88.21
(1)加了索引以后续担,對(duì)于MyISAM查詢(xún)可以加快:4 206.09733倍擅耽,對(duì)InnoDB查詢(xún)加快510.72921倍,同時(shí)對(duì)MyISAM更新速度減慢為原來(lái)的1/2赤拒,InnoDB的更新速度減慢為原來(lái)的1/30秫筏。要看情況決定是否要加索引诱鞠,比如不查詢(xún)的log表,不要做任何的索引这敬。
(2)如果你的數(shù)據(jù)量是百萬(wàn)級(jí)別的航夺,并且沒(méi)有任何的事務(wù)處理,那么用MyISAM是性能最好的選擇崔涂。
(3)InnoDB表的大小更加的大阳掐,用MyISAM可省很多的硬盤(pán)空間。
在我們測(cè)試的這個(gè)38w的表中冷蚂,表占用空間的情況如下:
引擎類(lèi)型?????????????? ???? MyISAM ???????? ???? InnoDB
數(shù)據(jù)?????????????????????? 53,924 KB?????????? 58,976 KB
索引????????????????????? ?13,640 KB???????? ??21,072 KB
占用總空間??????????? ? 67,564 KB????????? ?80,048 KB
另外一個(gè)176W萬(wàn)記錄的表缭保, 表占用空間的情況如下:
引擎類(lèi)型?????????? ???? MyIsam??????? ???? ? InnorDB
數(shù)據(jù)????????????? ?????56,166 KB???????? ??90,736 KB
索引?????????????????? 67,103 KB???????? ? 88,848 KB
占用總空間??????? 123,269 KB?????? ??179,584 KB
1.
a.Innodb引擎,Innodb引擎提供了對(duì)數(shù)據(jù)庫(kù)ACID事務(wù)的支持蝙茶。并且還提供了行級(jí)鎖和外鍵的約束艺骂。它的設(shè)計(jì)的目標(biāo)就是處理大數(shù)據(jù)容量的數(shù)據(jù)庫(kù)系統(tǒng)。它本身實(shí)際上是基于Mysql后臺(tái)的完整的系統(tǒng)隆夯。Mysql運(yùn)行的時(shí)候钳恕,Innodb會(huì)在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引蹄衷。但是忧额,該引擎是不支持全文搜索的。同時(shí)愧口,啟動(dòng)也比較的慢睦番,它是不會(huì)保存表的行數(shù)的。當(dāng)進(jìn)行Select count(*) from table指令的時(shí)候耍属,需要進(jìn)行掃描全表托嚣。所以當(dāng)需要使用數(shù)據(jù)庫(kù)的事務(wù)時(shí),該引擎就是首選恬涧。由于鎖的粒度小注益,寫(xiě)操作是不會(huì)鎖定全表的。所以在并發(fā)度較高的場(chǎng)景下使用會(huì)提升效率的溯捆。
b.MyIASM引擎,它是MySql的默認(rèn)引擎厦瓢,但不提供事務(wù)的支持提揍,也不支持行級(jí)鎖和外鍵。因此當(dāng)執(zhí)行Insert插入和Update更新語(yǔ)句時(shí)煮仇,即執(zhí)行寫(xiě)操作的時(shí)候需要鎖定這個(gè)表劳跃。所以會(huì)導(dǎo)致效率會(huì)降低。不過(guò)和Innodb不同的是浙垫,MyIASM引擎是保存了表的行數(shù)刨仑,于是當(dāng)進(jìn)行Select count(*) from table語(yǔ)句時(shí)郑诺,可以直接的讀取已經(jīng)保存的值而不需要進(jìn)行掃描全表。所以杉武,如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫(xiě)操作時(shí)辙诞,并且不需要事務(wù)的支持的∏岜В可以將MyIASM作為數(shù)據(jù)庫(kù)引擎的首先飞涂。
補(bǔ)充2點(diǎn):
c.大容量的數(shù)據(jù)集時(shí)趨向于選擇Innodb。因?yàn)樗С质聞?wù)處理和故障的恢復(fù)祈搜。Innodb可以利用數(shù)據(jù)日志來(lái)進(jìn)行數(shù)據(jù)的恢復(fù)较店。主鍵的查詢(xún)?cè)贗nnodb也是比較快的。
d.大批量的插入語(yǔ)句時(shí)(這里是INSERT語(yǔ)句)在MyIASM引擎中執(zhí)行的比較的快容燕,但是UPDATE語(yǔ)句在Innodb下執(zhí)行的會(huì)比較的快梁呈,尤其是在并發(fā)量大的時(shí)候。
2.兩種引擎所使用的索引的數(shù)據(jù)結(jié)構(gòu)是什么蘸秘?
答案:都是B+樹(shù)!
MyIASM引擎捧杉,B+樹(shù)的數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)的內(nèi)容實(shí)際上是實(shí)際數(shù)據(jù)的地址值。也就是說(shuō)它的索引和實(shí)際數(shù)據(jù)是分開(kāi)的秘血,只不過(guò)使用索引指向了實(shí)際數(shù)據(jù)味抖。這種索引的模式被稱(chēng)為非聚集索引。
Innodb引擎的索引的數(shù)據(jù)結(jié)構(gòu)也是B+樹(shù)灰粮,只不過(guò)數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)的都是實(shí)際的數(shù)據(jù)仔涩,這種索引有被稱(chēng)為聚集索引。
Mysql有兩種存儲(chǔ)引擎:InnoDB與Myisam粘舟,下表是兩種引擎的簡(jiǎn)單對(duì)比
MyISAM?InnoDB
構(gòu)成上的區(qū)別:每個(gè)MyISAM在磁盤(pán)上存儲(chǔ)成三個(gè)文件熔脂。第一個(gè) 文件的名字以表的名字開(kāi)始,擴(kuò)展名指出文件類(lèi)型柑肴。.frm文件存儲(chǔ)表定義霞揉。數(shù)據(jù)文件的擴(kuò) 展名為.MYD (MYData)。索引文件的擴(kuò) 展名是.MYI (MYIndex)晰骑。基于磁盤(pán)的資源是InnoDB表空間數(shù)據(jù)文件和它的日志文件适秩,InnoDB?表的 大小只受限于操作系統(tǒng)文件的大小,一般為?2GB
事務(wù)處理上方面:MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能硕舆,其執(zhí)行數(shù) 度比InnoDB類(lèi)型更快秽荞,但是不提供事務(wù)支持InnoDB提供事務(wù)支持事務(wù),外部鍵等高級(jí) 數(shù)據(jù)庫(kù)功能
SELECT?UPDATE?INSERT?Delete
如果執(zhí)行大量的SELECT抚官,MyISAM是更好的選擇扬跋;1.如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮凌节,應(yīng)該使用InnoDB表2.DELETE FROM table時(shí)钦听,InnoDB不會(huì)重新建立表洒试,而是一行一行的 刪除。3.LOAD TABLE FROM MASTER操作對(duì)InnoDB是不起作用的朴上,解決方法是首先把InnoDB表改成MyISAM表垒棋,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用
對(duì)AUTO_INCREMENT的 操作
每表一個(gè)AUTO_INCREMEN列的內(nèi)部處理余指。MyISAM為INSERT和UPDATE操 作自動(dòng)更新這一列捕犬。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不 能再利用酵镜。(當(dāng)AUTO_INCREMENT列被定義為多列索引的最后一列碉碉, 可以出現(xiàn)重使用從序列頂部刪除的值的情況)。AUTO_INCREMENT值可用ALTER TABLE或myisamch來(lái)重置淮韭。對(duì)于AUTO_INCREMENT類(lèi)型的字段垢粮,InnoDB中必須包含只有該字段的索引,但 是在MyISAM表中靠粪,可以和其他字段一起建立聯(lián)合索引更好和更快的auto_increment處理蜡吧。
如果你為一個(gè)表指定AUTO_INCREMENT列,在數(shù)據(jù)詞典里的InnoDB表句柄包含一個(gè)名為自動(dòng)增長(zhǎng)計(jì)數(shù)器的計(jì)數(shù)器占键,它被用在為該列賦新值昔善。自動(dòng)增長(zhǎng)計(jì)數(shù)器僅被存儲(chǔ)在主內(nèi)存中,而不是存在磁盤(pán)上畔乙。
表的具體行數(shù)
select count(*) from table,MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)君仆,注意的是,當(dāng)count(*)語(yǔ)句包含?where條件時(shí)牲距,兩種表的操作是一樣的返咱;InnoDB?中不 保存表的具體行數(shù),也就是說(shuō)牍鞠,執(zhí)行select count(*) from table時(shí)咖摹,InnoDB要掃描一遍整個(gè)表來(lái)計(jì)算有多少行
鎖
表鎖;提供行鎖(locking on row level)难述,提供與Oracle類(lèi)型一致的不加鎖讀取(non-locking read in?SELECTs)萤晴,另外,InnoDB表的行鎖也不是絕對(duì)的龄广,如果在執(zhí) 行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍硫眯,InnoDB表同樣會(huì)鎖全表,例如update table set num=1 where name like “%aaa%”
MySQL存儲(chǔ)引擎MyISAM與InnoDB如何選擇
MySQL有多種存儲(chǔ)引擎择同,每種存儲(chǔ)引擎有各自的優(yōu)缺點(diǎn),可以擇優(yōu)選擇使用:MyISAM净宵、InnoDB敲才、MERGE裹纳、MEMORY(HEAP)、BDB(BerkeleyDB)紧武、EXAMPLE剃氧、FEDERATED、ARCHIVE阻星、CSV朋鞍、BLACKHOLE。雖然MySQL里的存儲(chǔ)引擎不只是MyISAM與InnoDB這兩個(gè)妥箕,但常用的就是兩個(gè)。
兩種存儲(chǔ)引擎的大致區(qū)別表現(xiàn)在:
1)InnoDB支持事務(wù),MyISAM不支持仇矾,這一點(diǎn)是非常之重要潮孽。事務(wù)是一種高級(jí)的處理方式,如在一些列增刪改中只要哪個(gè)出錯(cuò)還可以回滾還原宇葱,而MyISAM就不可以了瘦真。
2)MyISAM適合查詢(xún)以及插入為主的應(yīng)用,InnoDB適合頻繁修改以及涉及到安全性較高的應(yīng)用
3)InnoDB支持外鍵黍瞧,MyISAM不支持
4)從MySQL5.5.5以后诸尽,InnoDB是默認(rèn)引擎
5)InnoDB不支持FULLTEXT類(lèi)型的索引
6)InnoDB中不保存表的行數(shù),如select count(*) from table時(shí)印颤,InnoDB需要掃描一遍整個(gè)表來(lái)計(jì)算有多少行您机,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可。注意的是膀哲,當(dāng)count(*)語(yǔ)句包含where條件時(shí)MyISAM也需要掃描整個(gè)表
7)對(duì)于自增長(zhǎng)的字段往产,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯(lián)合索引
8)清空整個(gè)表時(shí)某宪,InnoDB是一行一行的刪除仿村,效率非常慢。MyISAM則會(huì)重建表
9)InnoDB支持行鎖(某些情況下還是鎖整表兴喂,如 update table set a=1 where user like '%lee%'
關(guān)于MyISAM與InnoDB選擇使用:
MYISAM和INNODB是Mysql數(shù)據(jù)庫(kù)提供的兩種存儲(chǔ)引擎蔼囊。兩者的優(yōu)劣可謂是各有千秋。INNODB會(huì)支持一些關(guān)系數(shù)據(jù)庫(kù)的高級(jí)功能衣迷,如事務(wù)功能和行級(jí)鎖畏鼓,MYISAM不支持。MYISAM的性能更優(yōu)壶谒,占用的存儲(chǔ)空間少云矫。所以,選擇何種存儲(chǔ)引擎汗菜,視具體應(yīng)用而定:
1)如果你的應(yīng)用程序一定要使用事務(wù)让禀,毫無(wú)疑問(wèn)你要選擇INNODB引擎挑社。但要注意,INNODB的行級(jí)鎖是有條件的巡揍。在where條件沒(méi)有使用主鍵時(shí)痛阻,照樣會(huì)鎖全表。比如DELETE FROM mytable這樣的刪除語(yǔ)句腮敌。
2)如果你的應(yīng)用程序?qū)Σ樵?xún)性能要求較高阱当,就要使用MYISAM了。MYISAM索引和數(shù)據(jù)是分開(kāi)的糜工,而且其索引是壓縮的弊添,可以更好地利用內(nèi)存。所以它的查詢(xún)性能明顯優(yōu)于INNODB啤斗。壓縮后的索引也能節(jié)約一些磁盤(pán)空間表箭。MYISAM擁有全文索引的功能,這可以極大地優(yōu)化LIKE查詢(xún)的效率钮莲。
有人說(shuō)MYISAM只能用于小型應(yīng)用免钻,其實(shí)這只是一種偏見(jiàn)。如果數(shù)據(jù)量比較大崔拥,這是需要通過(guò)升級(jí)架構(gòu)來(lái)解決极舔,比如分表分庫(kù),而不是單純地依賴(lài)存儲(chǔ)引擎链瓦。一般都是選用innodb了拆魏,主要是myisam的全表鎖,讀寫(xiě)串行問(wèn)題慈俯,并發(fā)效率鎖表渤刃,效率低myisam對(duì)于讀寫(xiě)密集型應(yīng)用一般是不會(huì)去選用的。
關(guān)于Mysql數(shù)據(jù)庫(kù)默認(rèn)的存儲(chǔ)引擎:MyISAM和InnoDB是MySQL的兩種存儲(chǔ)引擎贴膘。如果是默認(rèn)安裝卖子,那就應(yīng)該是InnoDB,你可以在my.cnf文件中找到default-storage-engine=INNODB刑峡;通過(guò)show create table xx 可以看見(jiàn)相應(yīng)信息洋闽。Mysql中InnoDB和MyISAM的比較
1)MyISAM:
每個(gè)MyISAM在磁盤(pán)上存儲(chǔ)成三個(gè)文件。第一個(gè)文件的名字以表的名字開(kāi)始突梦,擴(kuò)展名指出文件類(lèi)型诫舅。.frm文件存儲(chǔ)表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)宫患。
MyISAM表格可以被壓縮刊懈,而且它們支持全文搜索。不支持事務(wù),而且也不支持外鍵俏讹。如果事物回滾將造成不完全回滾当宴,不具有原子性畜吊。在進(jìn)行updata時(shí)進(jìn)行表鎖泽疆,并發(fā)量相對(duì)較小。如果執(zhí)行大量的SELECT玲献,MyISAM是更好的選擇殉疼。MyISAM的索引和數(shù)據(jù)是分開(kāi)的,并且索引是有壓縮的捌年,內(nèi)存使用率就對(duì)應(yīng)提高了不少瓢娜。能加載更多索引,而Innodb是索引和數(shù)據(jù)是緊密捆綁的礼预,沒(méi)有使用壓縮從而會(huì)造成Innodb比MyISAM體積龐大不小眠砾。MyISAM緩存在內(nèi)存的是索引,不是數(shù)據(jù)托酸。而InnoDB緩存在內(nèi)存的是數(shù)據(jù)褒颈,相對(duì)來(lái)說(shuō),服務(wù)器內(nèi)存越大励堡,InnoDB發(fā)揮的優(yōu)勢(shì)越大谷丸。
優(yōu)點(diǎn):查詢(xún)數(shù)據(jù)相對(duì)較快,適合大量的select应结,可以全文索引刨疼。缺點(diǎn):不支持事務(wù),不支持外鍵鹅龄,并發(fā)量較小揩慕,不適合大量update
2)InnoDB:
這種類(lèi)型是事務(wù)安全的。.它與BDB類(lèi)型具有相同的特性,它們還支持外鍵扮休。InnoDB表格速度很快迎卤。具有比BDB還豐富的特性,因此如果需要一個(gè)事務(wù)安全的存儲(chǔ)引擎,建議使用它肛炮。在update時(shí)表進(jìn)行行鎖止吐,并發(fā)量相對(duì)較大。如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE侨糟,出于性能方面的考慮碍扔,應(yīng)該使用InnoDB表。
優(yōu)點(diǎn):支持事務(wù)秕重,支持外鍵不同,并發(fā)量較大,適合大量update缺點(diǎn):查詢(xún)數(shù)據(jù)相對(duì)較快,不適合大量的select二拐。
對(duì)于支持事務(wù)的InnoDB類(lèi)型的表服鹅,影響速度的主要原因是AUTOCOMMIT默認(rèn)設(shè)置是打開(kāi)的,而且程序沒(méi)有顯式調(diào)用BEGIN 開(kāi)始事務(wù)百新,導(dǎo)致每插入一條都自動(dòng)Commit企软,嚴(yán)重影響了速度。可以在執(zhí)行sql前調(diào)用begin饭望,多條sql形成一個(gè)事務(wù)(即使autocommit打開(kāi)也可以)仗哨,將大大提高性能。
基本的差別為:MyISAM類(lèi)型不支持事務(wù)處理等高級(jí)處理铅辞,而InnoDB類(lèi)型支持厌漂。MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快斟珊,但是不提供事務(wù)支持苇倡,而InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。