32 MySQL 儲存引擎概述
MySQL 資料庫提供了獨有的外掛式儲存引擎,常見儲存引擎有 InnoDB
、MyISAM
、NDB
、Memory
、Archive
、Federated
、Maria
等等,並且不同的儲存引擎有著完全不同的功能,建表的時候可以指定儲存引擎的型別,若不指定儲存引擎型別,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
儲存引擎表由 MYD
和 MYI
組成,其中 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 還提供了很多其他的儲存引擎,例如 Merge
、Sphinx
、Infobright
,它們分別有各自合適的應用場景,初學者多學習 InnoDB
儲存引擎, InnoDB
儲存引擎也是在面試中問的最頻繁的儲存引擎了。本小節內容只是簡單地介紹了這幾種儲存引擎,瞭解一下儲存引擎基礎知識,更深入的關於儲存引擎的知識就需要閱讀底層原始碼了。