1. 程式人生 > Mysql入門教學 >32 MySQL 儲存引擎概述

32 MySQL 儲存引擎概述

MySQL 資料庫提供了獨有的外掛式儲存引擎,常見儲存引擎有 InnoDBMyISAMNDBMemoryArchiveFederatedMaria 等等,並且不同的儲存引擎有著完全不同的功能,建表的時候可以指定儲存引擎的型別,若不指定儲存引擎型別,MySQL8.0 預設的儲存引擎就是 InnoDB;

1. InnoDB 儲存引擎

InnoDB 儲存引擎最大的特點是支援事務,它主要應用於事務(OLTP)相關的資料儲存。它的功能特點有 行鎖支援外來鍵,並且一般操作查詢不會產生鎖。InnoDB 儲存引擎從 MySLQ 5.5.5 之後的版本都是其預設的儲存引擎。
InnoDB 有多版本併發控制,並且有 4 種隔離級別,這種隔離級別分別為 順序讀(SERIALIZABLE)

可重複讀(REPEATABLE READ)讀已提交(READ COMMITTED)讀未提交(READ UNCOMMITTED)
下面通過一個建表 sql 來新建一個 InnoDB 儲存引擎型別的資料表:

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT ''`age` int(10) unsigned NOT NULL,
  `id_number` varchar(18) CHARACTER SET utf8 COLLATE
utf8_general_ci NOT NULL, `email` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

執行結果如下圖 :

圖片描述

Tips:如上圖所示, 其中 ENGINE=InnoDB 表示建表指定儲存引擎型別為 InnoDB

2. MyISAM 儲存引擎

MyISAM 儲存引擎是 MySQL 5.5.8 版本以前預設使用的儲存引擎,其不支援事務,MyISAM 儲存引擎表由 MYDMYI 組成,其中 MYD 用來存放資料的檔案,MYI

用來存放索引的檔案。

下面通過一個建表 sql 來新建一個 MyISAM 儲存引擎型別的資料表:

CREATE TABLE `test_my` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT ''`age` int(10) unsigned NOT NULL,
  `id_number` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

執行結果如下圖 :

圖片描述

Tips:注意:對於 MyISAM 儲存引擎, MySQL 資料庫只快取索引檔案,資料庫的資料檔案由作業系統完成。

3. NDB 儲存引擎

NDB 儲存引擎是一個叢集儲存引擎,其特點是資料全都存放在記憶體中(可以將非索引的資料放在磁碟上),通過主鍵查詢的速度非常快, NDB 儲存引擎的表連線操作(JOIN) 是由 MySQL Server 層完成的,其執行速度比較慢。因 NDB 是一個叢集儲存引擎,這裡不方便做演示了。

4. MEMORY 儲存引擎

Memory 儲存引擎將表中的資料存放在記憶體中,如果資料庫發生 崩潰(crash) 或者 重啟,則表中的資料會丟失。

下面通過一個建表 sql 來新建一個 MyISAM 儲存引擎型別的資料表:

CREATE TABLE `test_memory` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT ''`age` int(10) unsigned NOT NULL,
  `id_number` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

執行結果如下圖 :

圖片描述

5. ARCHIVE 儲存引擎

ARCHIVE 儲存引擎只支援 INSERT插入SELECT查詢 操作,這就意味著插入進去的資料不能更改,所以 ARCHIVE 儲存引擎非常適合儲存歸檔資料。
下面通過一個建表 sql 來新建一個 ARCHIVE 儲存引擎型別的資料表:

CREATE TABLE `test_archive` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT ''`age` int(10) unsigned NOT NULL,
  `id_number` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=ARCHIVE AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

執行結果如下圖 :

圖片描述

Tips:注意:ARCHIVE 儲存引擎使用行鎖來實現高併發的寫入操作,但其本身 不是crash safe 的儲存引擎。

6. FEDERATED 儲存引擎

FEDERATED 儲存引擎不存放資料,它指向遠端 MySQL 資料庫。本地只存放表的機構資訊,資料都通過遠端連線存放到遠端伺服器,增刪改查操作都是通過建立的連線來訪問遠端資料庫進行操作,把結果返回給本地。FEDERATED 儲存引擎預設是不開啟的,可以先檢視所有儲存引擎開啟狀態:

SHOW ENGINES; 

執行結果如下 :

圖片描述

Tips:若 FEDERATED 儲存引擎沒有啟用,可以在 MySQL 配置檔案中 [mysqld] 下面增加一行 federated,然後重啟 MySQL 即可開啟。。

下面通過一個建表 sql 來新建一個 FEDERATED 儲存引擎型別的資料表:

CREATE TABLE `test_fed` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT ''`age` int(10) unsigned NOT NULL,
  `id_number` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
)ENGINE=FEDERATED CONNECTION='mysql://root:[email protected]:3306/sakila/actor';

執行結果如下圖 :

圖片描述

7. MARIA 儲存引擎

MARIA 儲存引擎是一種比較新的儲存引擎,是為了取代原有的 MyISAM 儲存引擎,可以理解為 MyISAM 儲存引擎的後續版本。MARIA 儲存引擎的特點是支援資料和檔案索引,應用了行鎖設計,提供了多版本併發控制(MVCC),支援事務。

8. CSV 儲存引擎

邏輯上由逗號分割資料的儲存引擎。它會在資料庫子目錄裡為每個資料表建立一個.CSV檔案。這是一種普通文字檔案,每個資料行佔用一個文字行。CSV儲存引擎不支援索引。

9. 小結

本小節介紹了 8 種儲存引擎, MySQL 還提供了很多其他的儲存引擎,例如 MergeSphinxInfobright,它們分別有各自合適的應用場景,初學者多學習 InnoDB 儲存引擎, InnoDB 儲存引擎也是在面試中問的最頻繁的儲存引擎了。本小節內容只是簡單地介紹了這幾種儲存引擎,瞭解一下儲存引擎基礎知識,更深入的關於儲存引擎的知識就需要閱讀底層原始碼了。