MySQL數(shù) 據(jù)庫引擎取決于MySQL在安裝的時候是如何被編譯的。要添加一個新的引擎,就必須重新編譯MYSQL。在缺省情況下,MYSQL支持三個引擎:ISAM、MYISAM和HEAP。另外兩種類型INNODB和BERKLEY(BDB),也常??梢允褂?。如果技術高超,還可以使用MySQL++ API自己做一個引擎。下面介紹幾種數(shù)據(jù)庫引擎:
ISAM:ISAM是一個定義明確且歷經(jīng)時間考驗的數(shù)據(jù)表格管理方法,它在設計之時就考慮到 數(shù)據(jù)庫被查詢的次數(shù)要遠大于更新的次數(shù)。因此,ISAM執(zhí)行讀取操作的速度很快,而且不占用大量的內存和存儲資源。ISAM的兩個主要不足之處在于,它不 支持事務處理,也不能夠容錯:如果你的硬盤崩潰了,那么數(shù)據(jù)文件就無法恢復了。如果你正在把ISAM用在關鍵任務應用程序里,那就必須經(jīng)常備份你所有的實 時數(shù)據(jù),通過其復制特性,MYSQL能夠支持這樣的備份應用程序。
MyISAM:MyISAM是MySQL的ISAM擴展格式和缺省的數(shù)據(jù)庫引擎。除了提供ISAM里所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優(yōu)化多個并發(fā)的讀寫操作,其代價是你需要經(jīng)常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。MyISAM還有一些有用的擴展,例如用來修復數(shù)據(jù)庫文件的MyISAMCHK工具和用來恢復浪費空間的 MyISAMPACK工具。MYISAM強調了快速讀取操作,這可能就是為什么MySQL受到了WEB開發(fā)如此青睞的主要原因:在WEB開發(fā)中你所進行的大量數(shù)據(jù)操作都是讀取操作。所以,大多數(shù)虛擬主機提供商和INTERNET平臺提供商只允許使用MYISAM格式。MyISAM格式的一個重要缺陷就是不能在表損壞后恢復數(shù)據(jù)。
HEAP:HEAP允許只駐留在內存里的臨時表格。駐留在內存里讓HEAP要比ISAM和MYISAM都快,但是它所管理的數(shù)據(jù)是不穩(wěn)定的,而且如果在關機之前沒有進行保存,那么所有的數(shù)據(jù)都會丟失。在數(shù)據(jù)行被刪除的時候,HEAP也不會浪費大量的空間。HEAP表格在你需要使用SELECT表達式來選擇和操控數(shù)據(jù)的時候非常有用。要記住,在用完表格之后就刪除表格。
InnoDB:InnoDB數(shù)據(jù)庫引擎都是造就MySQL靈活性的技術的直接產品,這項技術就是MYSQL++ API。在使用MYSQL的時候,你所面對的每一個挑戰(zhàn)幾乎都源于ISAM和MyISAM數(shù)據(jù)庫引擎不支持事務處理(transaction process)也不支持外來鍵。盡管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了對事務處理和外來鍵的支持,這兩點都是前兩個引擎所沒有的。如前所述,如果你的設計需要這些特性中的一者 或者兩者,那你就要被迫使用后兩個引擎中的一個了。
MySQL 官方對InnoDB是這樣解釋的:InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB鎖定在行級并且也在SELECT語句提供一個Oracle風格一致的非鎖定讀,這些特色增加了多用戶部署和性能。沒有在InnoDB中擴大鎖定的需要,因為在InnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。
InnoDB是為處理巨大數(shù)據(jù)量時的最大性能設計,它的CPU效率可能是任何其它基于磁盤的關系數(shù)據(jù)庫引擎所不能匹敵的。
InnoDB存儲引擎被完全與MySQL服務器整合,InnoDB存儲引擎為在主內存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池。InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數(shù)個文件(或原始磁盤分區(qū))。這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統(tǒng)上。
InnoDB默認地被包含在MySQL二進制分發(fā)中。Windows Essentials installer使InnoDB成為Windows上MySQL的默認表。
InnoDB被用來在眾多需要高性能的大型數(shù)據(jù)庫站點上產生。著名的Internet新聞站點Slashdot.org運行在InnoDB上。 Mytrix, Inc.在InnoDB上存儲超過1TB的數(shù)據(jù),還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的
一般來說,MyISAM適合:(1)做很多count 的計算;(2)插入不頻繁,查詢非常頻繁;(3)沒有事務。InnoDB適合:(1)可靠性要求比較高,或者要求事務;(2)表更新和查詢都相當?shù)念l繁,并且表鎖定的機會比較大的情況。
一般情況下,MySQL會默認提供多種存儲引擎,可以通過下面的查看:
(1)看你的MySQL現(xiàn)在已提供什么存儲引擎: mysql>show engines;
(2)看你的MySQL當前默認的存儲引擎: mysql>show variables like '%storage_engine%';
(3)你要看某個表用了什么引擎(在顯示結果里參數(shù)engine后面的就表示該表當前用的存儲引擎): mysql>show create table 表名;
所有的性能測試在:Micrisoft window xp sp2 , Intel(R) Pentinum(R) M processor 1.6oGHz 1G 內存的電腦上測試。
測試方法:連續(xù)提交10個query, 表記錄總數(shù):38萬 , 時間單位 s
引擎類型????????????????? ? MyISAM ??????????? ?? InnoDB ???????????? 性能相差
count????????????????????? 0.0008357??????????? 3.0163??????????????? 3609
查詢主鍵????????????? ???? 0.005708?????????? ?? 0.1574????????????? ? 27.57
查詢非主鍵?????????? ?? ??? 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)加了索引以后,對于MyISAM查詢可以加快:4 206.09733倍,對InnoDB查詢加快510.72921倍,同時對MyISAM更新速度減慢為原來的1/2,InnoDB的更新速度減慢為原來的1/30。要看情況決定是否要加索引,比如不查詢的log表,不要做任何的索引。
(2)如果你的數(shù)據(jù)量是百萬級別的,并且沒有任何的事務處理,那么用MyISAM是性能最好的選擇。
(3)InnoDB表的大小更加的大,用MyISAM可省很多的硬盤空間。
在我們測試的這個38w的表中,表占用空間的情況如下:
引擎類型?????????????? ???? MyISAM ???????? ???? InnoDB
數(shù)據(jù)?????????????????????? 53,924 KB?????????? 58,976 KB
索引????????????????????? ?13,640 KB???????? ??21,072 KB
占用總空間??????????? ? 67,564 KB????????? ?80,048 KB
另外一個176W萬記錄的表, 表占用空間的情況如下:
引擎類型?????????? ???? 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引擎提供了對數(shù)據(jù)庫ACID事務的支持。并且還提供了行級鎖和外鍵的約束。它的設計的目標就是處理大數(shù)據(jù)容量的數(shù)據(jù)庫系統(tǒng)。它本身實際上是基于Mysql后臺的完整的系統(tǒng)。Mysql運行的時候,Innodb會在內存中建立緩沖池,用于緩沖數(shù)據(jù)和索引。但是,該引擎是不支持全文搜索的。同時,啟動也比較的慢,它是不會保存表的行數(shù)的。當進行Select count(*) from table指令的時候,需要進行掃描全表。所以當需要使用數(shù)據(jù)庫的事務時,該引擎就是首選。由于鎖的粒度小,寫操作是不會鎖定全表的。所以在并發(fā)度較高的場景下使用會提升效率的。
b.MyIASM引擎,它是MySql的默認引擎,但不提供事務的支持,也不支持行級鎖和外鍵。因此當執(zhí)行Insert插入和Update更新語句時,即執(zhí)行寫操作的時候需要鎖定這個表。所以會導致效率會降低。不過和Innodb不同的是,MyIASM引擎是保存了表的行數(shù),于是當進行Select count(*) from table語句時,可以直接的讀取已經(jīng)保存的值而不需要進行掃描全表。所以,如果表的讀操作遠遠多于寫操作時,并且不需要事務的支持的。可以將MyIASM作為數(shù)據(jù)庫引擎的首先。
補充2點:
c.大容量的數(shù)據(jù)集時趨向于選擇Innodb。因為它支持事務處理和故障的恢復。Innodb可以利用數(shù)據(jù)日志來進行數(shù)據(jù)的恢復。主鍵的查詢在Innodb也是比較快的。
d.大批量的插入語句時(這里是INSERT語句)在MyIASM引擎中執(zhí)行的比較的快,但是UPDATE語句在Innodb下執(zhí)行的會比較的快,尤其是在并發(fā)量大的時候。
2.兩種引擎所使用的索引的數(shù)據(jù)結構是什么?
答案:都是B+樹!
MyIASM引擎,B+樹的數(shù)據(jù)結構中存儲的內容實際上是實際數(shù)據(jù)的地址值。也就是說它的索引和實際數(shù)據(jù)是分開的,只不過使用索引指向了實際數(shù)據(jù)。這種索引的模式被稱為非聚集索引。
Innodb引擎的索引的數(shù)據(jù)結構也是B+樹,只不過數(shù)據(jù)結構中存儲的都是實際的數(shù)據(jù),這種索引有被稱為聚集索引。
Mysql有兩種存儲引擎:InnoDB與Myisam,下表是兩種引擎的簡單對比
MyISAM?InnoDB
構成上的區(qū)別:每個MyISAM在磁盤上存儲成三個文件。第一個 文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數(shù)據(jù)文件的擴 展名為.MYD (MYData)。索引文件的擴 展名是.MYI (MYIndex)。基于磁盤的資源是InnoDB表空間數(shù)據(jù)文件和它的日志文件,InnoDB?表的 大小只受限于操作系統(tǒng)文件的大小,一般為?2GB
事務處理上方面:MyISAM類型的表強調的是性能,其執(zhí)行數(shù) 度比InnoDB類型更快,但是不提供事務支持InnoDB提供事務支持事務,外部鍵等高級 數(shù)據(jù)庫功能
SELECT?UPDATE?INSERT?Delete
如果執(zhí)行大量的SELECT,MyISAM是更好的選擇;1.如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表2.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的 刪除。3.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數(shù)據(jù)后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用
對AUTO_INCREMENT的 操作
每表一個AUTO_INCREMEN列的內部處理。MyISAM為INSERT和UPDATE操 作自動更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不 能再利用。(當AUTO_INCREMENT列被定義為多列索引的最后一列, 可以出現(xiàn)重使用從序列頂部刪除的值的情況)。AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置。對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但 是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引更好和更快的auto_increment處理。
如果你為一個表指定AUTO_INCREMENT列,在數(shù)據(jù)詞典里的InnoDB表句柄包含一個名為自動增長計數(shù)器的計數(shù)器,它被用在為該列賦新值。自動增長計數(shù)器僅被存儲在主內存中,而不是存在磁盤上。
表的具體行數(shù)
select count(*) from table,MyISAM只要簡單的讀出保存好的行數(shù),注意的是,當count(*)語句包含?where條件時,兩種表的操作是一樣的;InnoDB?中不 保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行
鎖
表鎖;提供行鎖(locking on row level),提供與Oracle類型一致的不加鎖讀取(non-locking read in?SELECTs),另外,InnoDB表的行鎖也不是絕對的,如果在執(zhí) 行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”
MySQL存儲引擎MyISAM與InnoDB如何選擇
MySQL有多種存儲引擎,每種存儲引擎有各自的優(yōu)缺點,可以擇優(yōu)選擇使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。雖然MySQL里的存儲引擎不只是MyISAM與InnoDB這兩個,但常用的就是兩個。
兩種存儲引擎的大致區(qū)別表現(xiàn)在:
1)InnoDB支持事務,MyISAM不支持,這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而MyISAM就不可以了。
2)MyISAM適合查詢以及插入為主的應用,InnoDB適合頻繁修改以及涉及到安全性較高的應用
3)InnoDB支持外鍵,MyISAM不支持
4)從MySQL5.5.5以后,InnoDB是默認引擎
5)InnoDB不支持FULLTEXT類型的索引
6)InnoDB中不保存表的行數(shù),如select count(*) from table時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數(shù)即可。注意的是,當count(*)語句包含where條件時MyISAM也需要掃描整個表
7)對于自增長的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯(lián)合索引
8)清空整個表時,InnoDB是一行一行的刪除,效率非常慢。MyISAM則會重建表
9)InnoDB支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'
關于MyISAM與InnoDB選擇使用:
MYISAM和INNODB是Mysql數(shù)據(jù)庫提供的兩種存儲引擎。兩者的優(yōu)劣可謂是各有千秋。INNODB會支持一些關系數(shù)據(jù)庫的高級功能,如事務功能和行級鎖,MYISAM不支持。MYISAM的性能更優(yōu),占用的存儲空間少。所以,選擇何種存儲引擎,視具體應用而定:
1)如果你的應用程序一定要使用事務,毫無疑問你要選擇INNODB引擎。但要注意,INNODB的行級鎖是有條件的。在where條件沒有使用主鍵時,照樣會鎖全表。比如DELETE FROM mytable這樣的刪除語句。
2)如果你的應用程序對查詢性能要求較高,就要使用MYISAM了。MYISAM索引和數(shù)據(jù)是分開的,而且其索引是壓縮的,可以更好地利用內存。所以它的查詢性能明顯優(yōu)于INNODB。壓縮后的索引也能節(jié)約一些磁盤空間。MYISAM擁有全文索引的功能,這可以極大地優(yōu)化LIKE查詢的效率。
有人說MYISAM只能用于小型應用,其實這只是一種偏見。如果數(shù)據(jù)量比較大,這是需要通過升級架構來解決,比如分表分庫,而不是單純地依賴存儲引擎。一般都是選用innodb了,主要是myisam的全表鎖,讀寫串行問題,并發(fā)效率鎖表,效率低myisam對于讀寫密集型應用一般是不會去選用的。
關于Mysql數(shù)據(jù)庫默認的存儲引擎:MyISAM和InnoDB是MySQL的兩種存儲引擎。如果是默認安裝,那就應該是InnoDB,你可以在my.cnf文件中找到default-storage-engine=INNODB;通過show create table xx 可以看見相應信息。Mysql中InnoDB和MyISAM的比較
1)MyISAM:
每個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數(shù)據(jù)文件的擴展名為.MYD (MYData)。
MyISAM表格可以被壓縮,而且它們支持全文搜索。不支持事務,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。在進行updata時進行表鎖,并發(fā)量相對較小。如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。MyISAM的索引和數(shù)據(jù)是分開的,并且索引是有壓縮的,內存使用率就對應提高了不少。能加載更多索引,而Innodb是索引和數(shù)據(jù)是緊密捆綁的,沒有使用壓縮從而會造成Innodb比MyISAM體積龐大不小。MyISAM緩存在內存的是索引,不是數(shù)據(jù)。而InnoDB緩存在內存的是數(shù)據(jù),相對來說,服務器內存越大,InnoDB發(fā)揮的優(yōu)勢越大。
優(yōu)點:查詢數(shù)據(jù)相對較快,適合大量的select,可以全文索引。缺點:不支持事務,不支持外鍵,并發(fā)量較小,不適合大量update
2)InnoDB:
這種類型是事務安全的。.它與BDB類型具有相同的特性,它們還支持外鍵。InnoDB表格速度很快。具有比BDB還豐富的特性,因此如果需要一個事務安全的存儲引擎,建議使用它。在update時表進行行鎖,并發(fā)量相對較大。如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表。
優(yōu)點:支持事務,支持外鍵,并發(fā)量較大,適合大量update缺點:查詢數(shù)據(jù)相對較快,不適合大量的select。
對于支持事務的InnoDB類型的表,影響速度的主要原因是AUTOCOMMIT默認設置是打開的,而且程序沒有顯式調用BEGIN 開始事務,導致每插入一條都自動Commit,嚴重影響了速度。可以在執(zhí)行sql前調用begin,多條sql形成一個事務(即使autocommit打開也可以),將大大提高性能。
基本的差別為:MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持已經(jīng)外部鍵等高級數(shù)據(jù)庫功能。