MySQL有哪些儲存引擎,各自的優缺點,應用場景

Java知音發表於2018-09-27

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提供事務支援已經外部鍵等高階資料庫功能。

以下是架構進階資料,需要學習免費課程的狂戳

MySQL有哪些儲存引擎,各自的優缺點,應用場景


相關文章