1. 程式人生 > >MySQL存儲引擎MyISAM與InnoDB的區別

MySQL存儲引擎MyISAM與InnoDB的區別

myisam innodb 區別

寫在前面


MySQL,Oracle,SqlServer都是在關系型數據庫中都占有一席之地,MySQL數據庫也被稱為業內最廣泛使用的開源數據庫之一,而插件式存儲引擎的是其最重要的特點之一,了解其存儲引擎能更方便的使用MySQL數據庫的特性。

本節目標

  • 了解MySQL插件式存儲引擎

  • 掌握MyISAM和InnoDB存儲引擎的區別

插件式存儲引擎是什麽?


MySQL 的存儲引擎為插件式存儲引擎,即允許MySQL 官方提供,又允許第三方通過MySQL的API接口自行開發存儲引擎。MySQL中使用各種不同的技術,將數據放在不同的文件系統中進行存儲,例如針對內存數據庫(MEMORY引擎)則將數據直接存儲在內存中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的功能和 能力,通過選擇不同的技術,用戶能夠獲得額外的速度或者功能,從而改善應用的整體功能。例如,如果要研究大量的臨時數據,也許就需要使用內存存儲引擎,內存存儲引擎能夠在內存中存儲所有的表格數據,幫助用戶完成應用。又或者,用戶也許需要一個支持事務處理的數據庫,以確保事務處理不成功時數據的回退能力,這就需要使用支持事務處理的存儲引擎(InnoDB引擎)。這些不同的技術以及配套的相關功能在MySQL中被稱做存儲引擎(也稱做表類型)。MySQL默認配置了許多不同的 存儲引擎,可以預先設置或者在MySQL服務器中啟用。可以選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲信息、如何檢索這些信息以及需要數據結合什麽性能和功能的時候提供最大的靈活性。MySQL5.5之後提供10種存儲引擎,MEMORY,CSV,PERFORMANCE_SCHEMA,BLACKHOLE,MyISAM,MRG_MYISAM,ARCHIVE,FEDERATED,InnoDB,Aria。在MySQL的眾多存儲引擎中InoDB與MyISAM為使用最多的兩個存儲引擎。所以本文也主要講述這兩個存儲引擎之間的區別。


MyISAM和InnoDB存儲引擎的區別


在說兩者之間的區別之前,首先要弄清楚一個概念,存儲引擎是表級別的概念,所以才成為表類型,每創建一張表都可以指定所使用的存儲引擎,但是並不建議每張表都交叉使用不同的引擎。

1 數據文件

MyISAM存儲引擎每張表都創建三個文件

table_name.frm

存儲表的結構

table_name.MYD

存儲數據

table_name.MYI

存儲索引

InnoDB對把數據存儲與表空間中,分為兩種方式:所有InonoDB表的數據和索引放置於同一個表空間中和每個表單獨使用一個表空間存儲表的數據和索引。

當所有表位於同一表空間中,其數據文件存於數據目錄下以ibddata[#]來命名。這種方式不利於管理和備份恢復。所以一般使用第二種方式,每張表創建單獨的表空間,用來實現InnoDB所支持的高級特性,比如單表導入導出,單標備份等功能。數據文件為

table_name.ibd

存儲數據和索引

table_name.frm

存儲表結構定義

2 事務性

MyISAM類型的表強調性能,其執行速度比InnoDB類型更快但不提供事務的支持,也不支持外鍵,適用於大量select操作的應用場景。InnoDB支持事務,並把事務分為四個隔離級別,READ-UNCOMMITTED:讀未提交容易發生臟讀;READ-COMMITTED:讀提交,該級別不可重復讀;REPEATABLE-READ:可重復讀,該級別容易發生幻讀;SERIALIZABLE:串行化;默認級別為REPEATABLE-READ。適合對事務要求較高的場景中,較適用於處理大量短期事務。

3 鎖粒度

MyISAM的鎖粒度較為粗糙,為表級鎖。而InnoDB為行級鎖,並使用間隙鎖來防止幻讀。當然InnoDB的行級鎖也並非絕對,當SQL語句在執行過程中在不能確定掃描範圍時也會對整張表進行鎖定,例如updatestudents set sex=”M” where name like “%aaa%”;

4 索引類型

InnoDB為聚集索引,輔助索引,MyISAM為非聚集索引並且支持全文索引(fulltext index)。

5 備份策略

InnoDB支持熱備、溫備、冷備。崩潰後可安全恢復。MyISAM最支持溫備與冷備。崩潰後無法安全恢復。

6 其他

InnoDB支持自適應的hash索引,使用MVCC來支持高並發。在性能方面,支持預讀操作,內存數據緩沖,內存索引緩存,插入操作緩沖區等。InnoDB引擎支持延遲索引更新,和表壓縮等特性。

近年來,InnoDB已有取代MyISAM之趨勢。MySQL與mariadb的默認存儲引擎已使用InnoDB。


本文出自 “Keep simple keep stupid” 博客,請務必保留此出處http://yangzhiheng.blog.51cto.com/11586378/1980892

MySQL存儲引擎MyISAM與InnoDB的區別