面試突擊54:MySQL 常用引擎有哪些?

2022-06-06 12:05:52

MySQL 有很多儲存引擎(也叫資料引擎),所謂的儲存引擎是指用於儲存、處理和保護資料的核心服務。也就是儲存引擎是資料庫的底層軟體組織。在 MySQL 中可以使用「show engines」來查詢資料庫的所有儲存引擎,如下圖所示:

在上述列表中,我們最常用的儲存引擎有以下 3 種:

  1. InnoDB
  2. MyISAM
  3. MEMORY

下面我們分別來看。

1.InnoDB

InnoDB 是 MySQL 5.1 之後預設的儲存引擎,它支援事務、支援外來鍵、支援崩潰修復和自增列。如果對業務的完整性要求較高,比如張三給李四轉賬,需要減張三的錢,同時給李四加錢,這時候只能全部執行成功或全部執行失敗,此時可以通過 InnoDB 來控制事務的提交和回滾,從而保證業務的完整性。

優缺點分析

InnoDB 的優勢是支援事務、支援外來鍵、支援崩潰修復和自增列;它的缺點是讀寫效率較差、佔用的資料空間較大。

2.MyISAM

MyISAM 是 MySQL 5.1 之前預設的資料庫引擎,讀取效率較高,佔用資料空間較少,但不支援事務、不支援行級鎖、不支援外來鍵等特性。因為不支援行級鎖,因此在新增和修改操作時,會執行鎖表操作,所以它的寫入效率較低。

優缺點分析

MyISAM 引擎儲存了單獨的索引檔案 .myi,且它的索引是直接定位到 OFFSET 的,而 InnoDB 沒有單獨的物理索引儲存檔案,且 InnoDB 索引定址是先定位到塊資料,再定位到行資料,所以 MyISAM 的查詢效率是比 InnoDB 的查詢效率要高。但它不支援事務、不支援外來鍵,所以它的適用場景是讀多寫少,且對完整性要求不高的業務場景。

3.MEMORY

記憶體型資料庫引擎,所有的資料都儲存在記憶體中,因此它的讀寫效率很高,但 MySQL 服務重啟之後資料會丟失。它同樣不支援事務、不支援外來鍵。MEMORY 支援 Hash 索引或 B 樹索引,其中 Hash 索引是基於 key 查詢的,因此查詢效率特別高,但如果是基於範圍查詢的效率就比較低了。而前面兩種儲存引擎是基於 B+ 樹的資料結構實現了。

優缺點分析

MEMORY 讀寫效能很高,但 MySQL 服務重啟之後資料會丟失,它不支援事務和外來鍵。適用場景是讀寫效率要求高,但對資料丟失不敏感的業務場景。

4.檢視和設定儲存引擎

4.1 檢視儲存引擎

儲存引擎的設定粒度是表級別的,也就是每張表可以設定不同的儲存引擎,我們可以使用以下命令來查詢某張表的儲存引擎:

show create table t;

如下圖所示:

4.2 設定儲存引擎

在建立一張表的時候設定儲存引擎:

修改一張已經存在表的儲存引擎:

總結

MySQL 中最常見的儲存引擎有:InnoDB、MyISAM 和 MEMORY,其中 InnoDB 是 MySQL 5.1 之後預設的儲存引擎,它支援事務、支援外來鍵、支援崩潰修復和自增列,它的特點是穩定(能保證業務的完整性),但資料的讀寫效率一般;而 MyISAM 的查詢效率較高,但不支援事務和外來鍵;MEMORY 的讀寫效率最高,但因為資料都儲存在記憶體中的,所以 MySQL 服務重啟之後資料就會丟失,因此它只適用於資料丟失不敏感的業務場景。

是非審之於己,譭譽聽之於人,得失安之於數。

公眾號:Java面試真題解析

面試合集:https://gitee.com/mydb/interview