mysql存儲引擎之MyISAM 和 InnoDB的比較

1、什麼是存儲引擎sql

       存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)。
      在Oracle 和SQL Server等數據庫中只有一種存儲引擎,全部數據存儲管理機制都是同樣的。而MySql數據庫提供了多種存儲引擎。用戶能夠根據不一樣的需求爲數據表選擇不一樣的存儲引擎,用戶也能夠根據本身的須要編寫本身的存儲引擎。數據庫

2、MyISAM緩存

      它不支持事務,也不支持外鍵,尤爲是訪問速度快,對事務完整性沒有要求或者以SELECT、INSERT爲主的應用基本均可以使用這個引擎來建立表。每一個MyISAM在磁盤上存儲成3個文件,其中文件名和表名都相同,可是擴展名分別爲:安全

一、tb_Demo.frm(存儲表定義)服務器

二、tb_Demo.MYD(MYData,存儲數據)併發

三、Tb_Demo.MYI(MYIndex,存儲索引)工具

       數據文件和索引文件能夠放置在不一樣的目錄,平均分配IO,獲取更快的速度。要指定數據文件和索引文件的路徑,須要在建立表的時候經過DATA DIRECTORY和INDEX DIRECTORY語句指定,文件路徑須要使用絕對路徑。
  每一個MyISAM表都有一個標誌,服務器或myisamchk程序在檢查MyISAM數據表時會對這個標誌進行設置。MyISAM表還有一個標誌用來代表該數據表在上次使用後是否是被正常的關閉了。若是服務器覺得當機或崩潰,這個標誌能夠用來判斷數據表是否須要檢查和修復。若是想讓這種檢查自動進行,能夠在啓動服務器時使用--myisam-recover現象。這會讓服務器在每次打開一個MyISAM數據表是自動檢查數據表的標誌並進行必要的修復處理。MyISAM類型的表可能會損壞,可使用CHECK TABLE語句來檢查MyISAM表的健康,並用REPAIR TABLE語句修復一個損壞到MyISAM表。
性能

MyISAM的表還支持3種不一樣的存儲格式:優化

  • 靜態(固定長度)表
  • 動態表
  • 壓縮表

  其中靜態表是默認的存儲格式。靜態表中的字段都是非變長字段,這樣每一個記錄都是固定長度的,這種存儲方式的優勢是存儲很是迅速,容易緩存,出現故障容易恢復;缺點是佔用的空間一般比動態表多。靜態表在數據存儲時會根據列定義的寬度定義補足空格,可是在訪問的時候並不會獲得這些空格,這些空格在返回給應用以前已經去掉。同時須要注意:在某些狀況下可能須要返回字段後的空格,而使用這種格式時後面到空格會被自動處理掉。spa

  動態表包含變長字段,記錄不是固定長度的,這樣存儲的優勢是佔用空間較少,可是頻繁到更新刪除記錄會產生碎片,須要按期執行OPTIMIZE TABLE語句或myisamchk -r命令來改善性能,而且出現故障的時候恢復相對比較困難。

       壓縮表由myisamchk工具建立,佔據很是小的空間,由於每條記錄都是被單獨壓縮的,因此只有很是小的訪問開支。

      靜態MyISAM:若是數據表中的各數據列的長度都是預先固定好的,服務器將自動選擇這種表類型。由於數據表中每一條記錄所佔用的空間都是同樣的,因此這種表存取和更新的效率很是高。當數據受損時,恢復工做也比較容易作。

      動態MyISAM:若是數據表中出現varchar、xxxtext或xxxBLOB字段時,服務器將自動選擇這種表類型。相對於靜態MyISAM,這種表存儲空間比較小,但因爲每條記錄的長度不一,因此屢次修改數據後,數據表中的數據就可能離散的存儲在內存中,進而致使執行效率降低。同時,內存中也可能會出現不少碎片。所以,這種類型的表要常常用optimize table 命令或優化工具來進行碎片整理。

       壓縮MyISAM:以上說到的兩種類型的表均可以用myisamchk工具壓縮。這種類型的表進一步減少了佔用的存儲,可是這種表壓縮以後不能再被修改。另外,由於是壓縮數據,因此這種表在讀取的時候要先時行解壓縮。

       可是,無論是何種MyISAM表,目前它都不支持事務,行級鎖和外鍵約束的功能。

3、InnoDB

     InnoDB存儲引擎提供了具備提交、回滾和崩潰恢復能力的事務安全。可是對比MyISAM的存儲引擎,InnoDB寫的處理效率差一些而且會佔用更多的磁盤空間以保留數據和索引。

一、自動增加列:
  InnoDB表的自動增加列能夠手工插入,可是插入的若是是空或0,則實際插入到則是自動增加後到值。能夠經過"ALTER TABLE...AUTO_INCREMENT=n;"語句強制設置自動增加值的起始值,默認爲1,可是該強制到默認值是保存在內存中,數據庫重啓後該值將會丟失。可使用LAST_INSERT_ID()查詢當前線程最後插入記錄使用的值。若是一次插入多條記錄,那麼返回的是第一條記錄使用的自動增加值。
      對於InnoDB表,自動增加列必須是索引。若是是組合索引,也必須是組合索引的第一列,可是對於MyISAM表,自動增加列能夠是組合索引的其餘列,這樣插入記錄後,自動增加列是按照組合索引到前面幾列排序後遞增的。

二、外鍵約束:
  MySQL支持外鍵的存儲引擎只有InnoDB,在建立外鍵的時候,父表必須有對應的索引,子表在建立外鍵的時候也會自動建立對應的索引。
      在建立索引的時候,能夠指定在刪除、更新父表時,對子表進行的相應操做,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有關聯的狀況下,父表不能更新;casecade表示父表在更新或刪除時,更新或者刪除子表對應的記錄;set null 則表示父表在更新或者刪除的時候,子表對應的字段被set null。
  當某個表被其它表建立了外鍵參照,那麼該表對應的索引或主鍵被禁止刪除。
  可使用set foreign_key_checks=0;臨時關閉外鍵約束,set foreign_key_checks=1;打開約束。

4、MyISAM 和 InnoDB 的區別

雖然MySQL裏的存儲引擎不僅是MyISAM與InnoDB這兩個,但經常使用的就是兩個。

兩種存儲引擎的大體區別表如今:

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

二、MyISAM適合查詢以及插入爲主的應用,InnoDB適合頻繁修改以及涉及到安全性較高的應用。

三、InnoDB支持外鍵,MyISAM不支持。

四、從MySQL5.5.5之後,InnoDB是默認引擎。

五、InnoDB不支持FULLTEXT類型的索引。

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

七、對於自增加的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中能夠和其餘字段一塊兒創建聯合索引。

八、清空整個表時,InnoDB是一行一行的刪除,效率很是慢。MyISAM則會重建表。

九、InnoDB支持行鎖(某些狀況下仍是鎖整表,如 update table set a=1 where user like '%lee%')。

4、關於MyISAM與InnoDB選擇使用:

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

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

二、若是你的應用程序對查詢性能要求較高,就要使用MYISAM了。MYISAM索引和數據是分開的,並且其索引是壓縮的,能夠更好地利用內存。因此它的查詢性能明顯優於INNODB。壓縮後的索引也能節約一些磁盤空間。MYISAM擁有全文索引的功能,這能夠極大地優化LIKE查詢的效率。

如今通常都是選用innodb了,主要是myisam的全表鎖,讀寫串行問題,併發效率鎖表,效率低myisam對於讀寫密集型應用通常是不會去選用的。


關於Mysql數據庫默認的存儲引擎:

MyISAM和InnoDB是MySQL的兩種存儲引擎。
若是是默認安裝,那就應該是InnoDB,你能夠在my.cnf文件中找到default-storage-engine=INNODB;
固然你能夠在建表時指定相應的存儲引擎。
經過show create table xx 能夠看見相應信息。

Mysql中InnoDB和MyISAM的比較

一、MyISAM:
     每一個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名爲.MYD (MYData)。
MyISAM表格能夠被壓縮,並且它們支持全文搜索。不支持事務,並且也不支持外鍵。若是事物回滾將形成不徹底回滾,不具備原子性。在進行update時進行表鎖,併發量相對較小。若是執行大量的SELECT,MyISAM是更好的選擇。

      MyISAM的索引和數據是分開的,而且索引是有壓縮的,內存使用率就對應提升了很多。能加載更多索引,而Innodb是索引和數據是緊密捆綁的,沒有使用壓縮從而會形成Innodb比MyISAM體積龐大很多。

      MyISAM緩存在內存的是索引,不是數據。而InnoDB緩存在內存的是數據,相對來講,服務器內存越大,InnoDB發揮的優點越大。

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

二、InnoDB:

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

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

      對於支持事物的InnoDB類型的表,影響速度的主要緣由是AUTOCOMMIT默認設置是打開的,並且程序沒有顯式調用BEGIN 開始事務,致使每插入一條都自動Commit,嚴重影響了速度。能夠在執行sql前調用begin,多條sql造成一個事物(即便autocommit打開也能夠),將大大提升性能。

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

主要區別:

  • MyISAM是非事務安全型的,而InnoDB是事務安全型的。
  • MyISAM鎖的粒度是表級,而InnoDB支持行級鎖定。
  • MyISAM支持全文類型索引,而InnoDB不支持全文索引。
  • MyISAM相對簡單,因此在效率上要優於InnoDB,小型應用能夠考慮使用MyISAM。
  • MyISAM表是保存成文件的形式,在跨平臺的數據轉移中使用MyISAM存儲會省去很多的麻煩。
  • InnoDB表比MyISAM表更安全,能夠在保證數據不會丟失的狀況下,切換非事務表到事務表(alter table tablename type=innodb)。

應用場景:

  • MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。若是應用中須要執行大量的SELECT查詢,那麼MyISAM是更好的選擇。
  • InnoDB用於事務處理應用程序,具備衆多特性,包括ACID事務支持。若是應用中須要執行大量的INSERT或UPDATE操做,則應該使用InnoDB,這樣能夠提升多用戶併發操做的性能。
相關文章
相關標籤/搜索