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 存儲引擎也是在面試中問的最頻繁的存儲引擎了。本小節內容只是簡單地介紹了這幾種存儲引擎,了解一下存儲引擎基礎知識,更深入的關于存儲引擎的知識就需要閱讀底層源碼了。