Mysql存儲引擎以及區別

MySQL數 據庫引擎取決于MySQL在安裝的時候是如何被編譯的。要添加一個新的引擎,就必須重新編譯MYSQL。在缺省情況下,MYSQL支持三個引擎:ISAM、MYISAM和HEAP。另外兩種類型INNODB和BERKLEY(BDB),也常??梢允褂?。如果技術高超,還可以使用MySQL++ API自己做一個引擎。下面介紹幾種數據庫引擎:

ISAM:ISAM是一個定義明確且歷經時間考驗的數據表格管理方法,它在設計之時就考慮到 數據庫被查詢的次數要遠大于更新的次數。因此,ISAM執行讀取操作的速度很快,而且不占用大量的內存和存儲資源。ISAM的兩個主要不足之處在于,它不 支持事務處理,也不能夠容錯:如果你的硬盤崩潰了,那么數據文件就無法恢復了。如果你正在把ISAM用在關鍵任務應用程序里,那就必須經常備份你所有的實 時數據,通過其復制特性,MYSQL能夠支持這樣的備份應用程序。

MyISAM:MyISAM是MySQL的ISAM擴展格式和缺省的數據庫引擎。除了提供ISAM里所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優化多個并發的讀寫操作,其代價是你需要經常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。MyISAM還有一些有用的擴展,例如用來修復數據庫文件的MyISAMCHK工具和用來恢復浪費空間的 MyISAMPACK工具。MYISAM強調了快速讀取操作,這可能就是為什么MySQL受到了WEB開發如此青睞的主要原因:在WEB開發中你所進行的大量數據操作都是讀取操作。所以,大多數虛擬主機提供商和INTERNET平臺提供商只允許使用MYISAM格式。MyISAM格式的一個重要缺陷就是不能在表損壞后恢復數據

HEAP:HEAP允許只駐留在內存里的臨時表格。駐留在內存里讓HEAP要比ISAM和MYISAM都快,但是它所管理的數據是不穩定的,而且如果在關機之前沒有進行保存,那么所有的數據都會丟失。在數據行被刪除的時候,HEAP也不會浪費大量的空間。HEAP表格在你需要使用SELECT表達式來選擇和操控數據的時候非常有用。要記住,在用完表格之后就刪除表格。

InnoDB:InnoDB數據庫引擎都是造就MySQL靈活性的技術的直接產品,這項技術就是MYSQL++ API。在使用MYSQL的時候,你所面對的每一個挑戰幾乎都源于ISAM和MyISAM數據庫引擎不支持事務處理(transaction process)也不支持外來鍵。盡管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了對事務處理和外來鍵的支持,這兩點都是前兩個引擎所沒有的。如前所述,如果你的設計需要這些特性中的一者 或者兩者,那你就要被迫使用后兩個引擎中的一個了。

MySQL 官方對InnoDB是這樣解釋的:InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB鎖定在行級并且也在SELECT語句提供一個Oracle風格一致的非鎖定讀,這些特色增加了多用戶部署和性能。沒有在InnoDB中擴大鎖定的需要,因為在InnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。

InnoDB是為處理巨大數據量時的最大性能設計,它的CPU效率可能是任何其它基于磁盤的關系數據庫引擎所不能匹敵的。

InnoDB存儲引擎被完全與MySQL服務器整合,InnoDB存儲引擎為在主內存中緩存數據和索引而維持它自己的緩沖池。InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數個文件(或原始磁盤分區)。這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統上。

InnoDB默認地被包含在MySQL二進制分發中。Windows Essentials installer使InnoDB成為Windows上MySQL的默認表。

InnoDB被用來在眾多需要高性能的大型數據庫站點上產生。著名的Internet新聞站點Slashdot.org運行在InnoDB上。 Mytrix, Inc.在InnoDB上存儲超過1TB的數據,還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的

一般來說,MyISAM適合:(1)做很多count 的計算;(2)插入不頻繁,查詢非常頻繁;(3)沒有事務。InnoDB適合:(1)可靠性要求比較高,或者要求事務;(2)表更新和查詢都相當的頻繁,并且表鎖定的機會比較大的情況。

一般情況下,MySQL會默認提供多種存儲引擎,可以通過下面的查看:

(1)看你的MySQL現在已提供什么存儲引擎: mysql>show engines;

(2)看你的MySQL當前默認的存儲引擎: mysql>show variables like '%storage_engine%';

(3)你要看某個表用了什么引擎(在顯示結果里參數engine后面的就表示該表當前用的存儲引擎): mysql>show create table 表名;

所有的性能測試在:Micrisoft window xp sp2 , Intel(R) Pentinum(R) M processor 1.6oGHz 1G 內存的電腦上測試。

測試方法:連續提交10個query, 表記錄總數: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)如果你的數據量是百萬級別的,并且沒有任何的事務處理,那么用MyISAM是性能最好的選擇。

(3)InnoDB表的大小更加的大,用MyISAM可省很多的硬盤空間。

在我們測試的這個38w的表中,表占用空間的情況如下:

引擎類型?????????????? ???? MyISAM ???????? ???? InnoDB

數據?????????????????????? 53,924 KB?????????? 58,976 KB

索引????????????????????? ?13,640 KB???????? ??21,072 KB

占用總空間??????????? ? 67,564 KB????????? ?80,048 KB

另外一個176W萬記錄的表, 表占用空間的情況如下:

引擎類型?????????? ???? MyIsam??????? ???? ? InnorDB

數據????????????? ?????56,166 KB???????? ??90,736 KB

索引?????????????????? 67,103 KB???????? ? 88,848 KB

占用總空間??????? 123,269 KB?????? ??179,584 KB


1.

a.Innodb引擎,Innodb引擎提供了對數據庫ACID事務的支持。并且還提供了行級鎖和外鍵的約束。它的設計的目標就是處理大數據容量的數據庫系統。它本身實際上是基于Mysql后臺的完整的系統。Mysql運行的時候,Innodb會在內存中建立緩沖池,用于緩沖數據和索引。但是,該引擎是不支持全文搜索的。同時,啟動也比較的慢,它是不會保存表的行數的。當進行Select count(*) from table指令的時候,需要進行掃描全表。所以當需要使用數據庫的事務時,該引擎就是首選。由于鎖的粒度小,寫操作是不會鎖定全表的。所以在并發度較高的場景下使用會提升效率的。

b.MyIASM引擎,它是MySql的默認引擎,但不提供事務的支持,也不支持行級鎖和外鍵。因此當執行Insert插入和Update更新語句時,即執行寫操作的時候需要鎖定這個表。所以會導致效率會降低。不過和Innodb不同的是,MyIASM引擎是保存了表的行數,于是當進行Select count(*) from table語句時,可以直接的讀取已經保存的值而不需要進行掃描全表。所以,如果表的讀操作遠遠多于寫操作時,并且不需要事務的支持的??梢詫yIASM作為數據庫引擎的首先。

補充2點:

c.大容量的數據集時趨向于選擇Innodb。因為它支持事務處理和故障的恢復。Innodb可以利用數據日志來進行數據的恢復。主鍵的查詢在Innodb也是比較快的。

d.大批量的插入語句時(這里是INSERT語句)在MyIASM引擎中執行的比較的快,但是UPDATE語句在Innodb下執行的會比較的快,尤其是在并發量大的時候。

2.兩種引擎所使用的索引的數據結構是什么?

答案:都是B+樹!

MyIASM引擎,B+樹的數據結構中存儲的內容實際上是實際數據的地址值。也就是說它的索引和實際數據是分開的,只不過使用索引指向了實際數據。這種索引的模式被稱為非聚集索引。

Innodb引擎的索引的數據結構也是B+樹,只不過數據結構中存儲的都是實際的數據,這種索引有被稱為聚集索引。



Mysql有兩種存儲引擎:InnoDB與Myisam,下表是兩種引擎的簡單對比

MyISAM?InnoDB

構成上的區別:每個MyISAM在磁盤上存儲成三個文件。第一個 文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴 展名為.MYD (MYData)。索引文件的擴 展名是.MYI (MYIndex)。基于磁盤的資源是InnoDB表空間數據文件和它的日志文件,InnoDB?表的 大小只受限于操作系統文件的大小,一般為?2GB

事務處理上方面:MyISAM類型的表強調的是性能,其執行數 度比InnoDB類型更快,但是不提供事務支持InnoDB提供事務支持事務,外部鍵等高級 數據庫功能

SELECT?UPDATE?INSERT?Delete

如果執行大量的SELECT,MyISAM是更好的選擇;1.如果你的數據執行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表2.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的 刪除3.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用

AUTO_INCREMENT的 操作

每表一個AUTO_INCREMEN列的內部處理。MyISAM為INSERT和UPDATE操 作自動更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂的值被刪除之后就不 能再利用。(當AUTO_INCREMENT列被定義為多列索引的最后一列, 可以出現重使用從序列頂部刪除的值的情況)。AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置。對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但 是在MyISAM表中,可以和其他字段一起建立聯合索引更好和更快的auto_increment處理。

如果你為一個表指定AUTO_INCREMENT列,在數據詞典里的InnoDB表句柄包含一個名為自動增長計數器的計數器,它被用在為該列賦新值。自動增長計數器僅被存儲在主內存中,而不是存在磁盤上。

表的具體行數

select count(*) from table,MyISAM只要簡單的讀出保存好的行數,注意的是,當count(*)語句包含?where條件時,兩種表的操作是一樣的;InnoDB?中不 保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行

表鎖;提供行鎖(locking on row level),提供與Oracle類型一致的不加鎖讀取(non-locking read in?SELECTs),另外,InnoDB表的行鎖也不是絕對的,如果在執 行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”

MySQL存儲引擎MyISAM與InnoDB如何選擇

MySQL有多種存儲引擎,每種存儲引擎有各自的優缺點,可以擇優選擇使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。雖然MySQL里的存儲引擎不只是MyISAM與InnoDB這兩個,但常用的就是兩個。

兩種存儲引擎的大致區別表現在:

1)InnoDB支持事務,MyISAM不支持,這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而MyISAM就不可以了。

2)MyISAM適合查詢以及插入為主的應用,InnoDB適合頻繁修改以及涉及到安全性較高的應用

3)InnoDB支持外鍵,MyISAM不支持

4)從MySQL5.5.5以后,InnoDB是默認引擎

5)InnoDB不支持FULLTEXT類型的索引

6)InnoDB中不保存表的行數,如select count(*) from table時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含where條件時MyISAM也需要掃描整個表

7)對于自增長的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯合索引

8)清空整個表時,InnoDB是一行一行的刪除,效率非常慢。MyISAM則會重建表

9)InnoDB支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'

關于MyISAM與InnoDB選擇使用:

MYISAM和INNODB是Mysql數據庫提供的兩種存儲引擎。兩者的優劣可謂是各有千秋。INNODB會支持一些關系數據庫的高級功能,如事務功能和行級鎖,MYISAM不支持。MYISAM的性能更優,占用的存儲空間少。所以,選擇何種存儲引擎,視具體應用而定:

1)如果你的應用程序一定要使用事務,毫無疑問你要選擇INNODB引擎。但要注意,INNODB的行級鎖是有條件的。在where條件沒有使用主鍵時,照樣會鎖全表。比如DELETE FROM mytable這樣的刪除語句。

2)如果你的應用程序對查詢性能要求較高,就要使用MYISAM了。MYISAM索引和數據是分開的,而且其索引是壓縮的,可以更好地利用內存。所以它的查詢性能明顯優于INNODB壓縮后的索引也能節約一些磁盤空間。MYISAM擁有全文索引的功能,這可以極大地優化LIKE查詢的效率。

有人說MYISAM只能用于小型應用,其實這只是一種偏見。如果數據量比較大,這是需要通過升級架構來解決,比如分表分庫,而不是單純地依賴存儲引擎。一般都是選用innodb了,主要是myisam的全表鎖,讀寫串行問題,并發效率鎖表,效率低myisam對于讀寫密集型應用一般是不會去選用的。

關于Mysql數據庫默認的存儲引擎:MyISAM和InnoDB是MySQL的兩種存儲引擎。如果是默認安裝,那就應該是InnoDB,你可以在my.cnf文件中找到default-storage-engine=INNODB;通過show create table xx 可以看見相應信息。Mysql中InnoDB和MyISAM的比較

1)MyISAM:

每個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名為.MYD (MYData)。

MyISAM表格可以被壓縮,而且它們支持全文搜索。不支持事務,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。在進行updata時進行表鎖,并發量相對較小。如果執行大量的SELECT,MyISAM是更好的選擇。MyISAM的索引和數據是分開的,并且索引是有壓縮的,內存使用率就對應提高了不少。能加載更多索引,而Innodb是索引和數據是緊密捆綁的,沒有使用壓縮從而會造成Innodb比MyISAM體積龐大不小。MyISAM緩存在內存的是索引,不是數據。而InnoDB緩存在內存的是數據,相對來說,服務器內存越大,InnoDB發揮的優勢越大。

優點:查詢數據相對較快,適合大量的select,可以全文索引。缺點:不支持事務,不支持外鍵,并發量較小,不適合大量update

2)InnoDB:

這種類型是事務安全的。.它與BDB類型具有相同的特性,它們還支持外鍵。InnoDB表格速度很快。具有比BDB還豐富的特性,因此如果需要一個事務安全的存儲引擎,建議使用它。在update時表進行行鎖,并發量相對較大。如果你的數據執行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表。

優點:支持事務,支持外鍵,并發量較大,適合大量update缺點:查詢數據相對較快,不適合大量的select。

對于支持事務的InnoDB類型的表,影響速度的主要原因是AUTOCOMMIT默認設置是打開的,而且程序沒有顯式調用BEGIN 開始事務,導致每插入一條都自動Commit,嚴重影響了速度。可以在執行sql前調用begin,多條sql形成一個事務(即使autocommit打開也可以),將大大提高性能。

基本的差別為:MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容