天天看點

MySQL有哪些存儲引擎

經常面試都會問到MYSQL有哪些存儲引擎,以及各自的優缺點。今天主要分享常見的存儲引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)等,以及最常用的MyISAM與InnoDB兩個引擎 ,文章尾部有兩者的詳細比較。

MySQL常用存儲引擎介紹

1.InnoDB 引擎(MySQL5.5以後預設使用)

MySQL 5.5 及以後版本中的預設存儲引擎,他的優點如下:

災難恢複性好

支援事務

使用行級鎖

支援外鍵關聯

支援熱備份

對于InnoDB引擎中的表,其資料的實體組織形式是簇表(Cluster Table),主鍵索引和資料是在一起的,資料按主鍵的順序實體分布

實作了緩沖管理,不僅能緩沖索引也能緩沖資料,并且會自動建立散列索引以加快資料的擷取

支援熱備份

2.MyISAM引擎

特性如下:

不支援事務

使用表級鎖,并發性差

主機當機後,MyISAM表易損壞,災難恢複性不佳

可以配合鎖,實作作業系統下的複制備份、遷移

隻緩存索引,資料的緩存是利用作業系統緩沖區來實作的。可能引發過多的系統調用且效率不佳

資料緊湊存儲,是以可獲得更小的索引和更快的全表掃描性能

3.MEMORY 存儲引擎

提供記憶體表,也不支援事務和外鍵。顯著提高通路資料的速度,可用于緩存會頻繁通路的、可以重構的資料、計算結果、統計值、中間結果。

缺點如下:

使用表級鎖,雖然記憶體通路快,但如果頻繁的讀寫,表級鎖會成為瓶頸

隻支援固定大小的行。Varchar類型的字段會存儲為固定長度的Char類型,浪費空間

不支援TEXT、BLOB字段。當有些查詢需要使用到臨時表(使用的也是MEMORY存儲引擎)時,如果表中有TEXT、BLOB字段,那麼會轉換為基于磁盤的MyISAM表,嚴重降低性能

由于記憶體資源成本昂貴,一般不建議設定過大的記憶體表,如果記憶體表滿了,可通過清除資料或調整記憶體表參數來避免報錯

伺服器重新開機後資料會丢失,複制維護時需要小心

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

1.兩種存儲引擎的大緻差別表現在:

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的全表鎖,讀寫串行問題,并發效率鎖表,效率低,MyISAM對于讀寫密集型應用一般是不會去選用的。

總之:

1.MyISAM類型不支援事務處理等進階處理,而InnoDB類型支援。

2.MyISAM類型的表強調的是性能,其執行速度比InnoDB類型更快,但是不提供事務支援,而InnoDB提供事務支援已經外部鍵等進階資料庫功能。

想要了解更多關于java教育訓練技術知識歡迎關注小編!

MySQL有哪些存儲引擎