MySQL 存儲引擎概述
MySQL 數(shù)據(jù)庫提供了獨(dú)有的插件式存儲引擎,常見存儲引擎有 InnoDB、MyISAM、NDB、Memory、Archive、Federated、Maria 等等,并且不同的存儲引擎有著完全不同的功能,建表的時候可以指定存儲引擎的類型,若不指定存儲引擎類型,MySQL8.0 默認(rèn)的存儲引擎就是 InnoDB。
1. InnoDB 存儲引擎
InnoDB 存儲引擎最大的特點是支持事務(wù),它主要應(yīng)用于事務(wù)(OLTP)相關(guān)的數(shù)據(jù)存儲。它的功能特點有行鎖、支持外鍵,并且一般操作查詢不會產(chǎn)生鎖。InnoDB 存儲引擎從 MySLQ 5.5.5 之后的版本都是其默認(rèn)的存儲引擎。
InnoDB 有多版本并發(fā)控制,并且有 4 種隔離級別,這種隔離級別分別為 順序讀(SERIALIZABLE)、可重復(fù)讀(REPEATABLE READ)、讀已提交(READ COMMITTED)、讀未提交(READ UNCOMMITTED)。
下面通過一個建表 sql 來新建一個 InnoDB 存儲引擎類型的數(shù)據(jù)表:
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;
執(zhí)行結(jié)果如下圖 :
Tips:如上圖所示, 其中
ENGINE=InnoDB
表示建表指定存儲引擎類型為 InnoDB。
2. MyISAM 存儲引擎
MyISAM 存儲引擎是 MySQL 5.5.8 版本以前默認(rèn)使用的存儲引擎,其不支持事務(wù),MyISAM 存儲引擎表由 MYD 和 MYI 組成,其中 MYD 用來存放數(shù)據(jù)的文件,MYI
用來存放索引的文件。
下面通過一個建表 sql 來新建一個 MyISAM 存儲引擎類型的數(shù)據(jù)表:
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;
執(zhí)行結(jié)果如下圖 :
Tips:注意:對于 MyISAM 存儲引擎, MySQL 數(shù)據(jù)庫只緩存索引文件,數(shù)據(jù)庫的數(shù)據(jù)文件由操作系統(tǒng)完成。
3. NDB 存儲引擎
NDB 存儲引擎是一個集群存儲引擎,其特點是數(shù)據(jù)全都存放在內(nèi)存中(可以將非索引的數(shù)據(jù)放在磁盤上),通過主鍵查找的速度非常快, NDB 存儲引擎的表連接操作(JOIN) 是由 MySQL Server 層完成的,其執(zhí)行速度比較慢。因 NDB 是一個集群存儲引擎,這里不方便做演示了。
4. MEMORY 存儲引擎
Memory 存儲引擎將表中的數(shù)據(jù)存放在內(nèi)存中,如果數(shù)據(jù)庫發(fā)生 崩潰(crash)或者重啟,則表中的數(shù)據(jù)會丟失。
下面通過一個建表 sql 來新建一個 MyISAM 存儲引擎類型的數(shù)據(jù)表:
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;
執(zhí)行結(jié)果如下圖 :
5. ARCHIVE 存儲引擎
ARCHIVE 存儲引擎只支持 INSERT插入和 SELECT 查詢 操作,這就意味著插入進(jìn)去的數(shù)據(jù)不能更改,所以 ARCHIVE 存儲引擎非常適合存儲歸檔數(shù)據(jù)。
下面通過一個建表 sql 來新建一個 ARCHIVE 存儲引擎類型的數(shù)據(jù)表:
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;
執(zhí)行結(jié)果如下圖 :
Tips:注意:ARCHIVE 存儲引擎使用行鎖來實現(xiàn)高并發(fā)的寫入操作,但其本身不是 crash safe 的存儲引擎。
6. FEDERATED 存儲引擎
FEDERATED 存儲引擎不存放數(shù)據(jù),它指向遠(yuǎn)程 MySQL 數(shù)據(jù)庫。本地只存放表的機(jī)構(gòu)信息,數(shù)據(jù)都通過遠(yuǎn)程連接存放到遠(yuǎn)程服務(wù)器,增刪改查操作都是通過建立的連接來訪問遠(yuǎn)程數(shù)據(jù)庫進(jìn)行操作,把結(jié)果返回給本地。FEDERATED 存儲引擎默認(rèn)是不開啟的,可以先查看所有存儲引擎開啟狀態(tài):
SHOW ENGINES;
執(zhí)行結(jié)果如下 :
Tips:若 FEDERATED 存儲引擎沒有啟用,可以在 MySQL 配置文件中 [mysqld] 下面增加一行 federated,然后重啟 MySQL 即可開啟。
下面通過一個建表 sql 來新建一個 FEDERATED 存儲引擎類型的數(shù)據(jù)表:
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:123456@127.0.0.1:3306/sakila/actor';
執(zhí)行結(jié)果如下圖 :
7. MARIA 存儲引擎
MARIA 存儲引擎是一種比較新的存儲引擎,是為了取代原有的 MyISAM 存儲引擎,可以理解為 MyISAM 存儲引擎的后續(xù)版本。MARIA 存儲引擎的特點是支持?jǐn)?shù)據(jù)和文件索引,應(yīng)用了行鎖設(shè)計,提供了多版本并發(fā)控制(MVCC),支持事務(wù)。
8. CSV 存儲引擎
邏輯上由逗號分割數(shù)據(jù)的存儲引擎。它會在數(shù)據(jù)庫子目錄里為每個數(shù)據(jù)表創(chuàng)建一個.CSV文件。這是一種普通文本文件,每個數(shù)據(jù)行占用一個文本行。CSV存儲引擎不支持索引。
9. 小結(jié)
本小節(jié)介紹了 8 種存儲引擎, MySQL 還提供了很多其他的存儲引擎,例如 Merge、Sphinx、Infobright,它們分別有各自合適的應(yīng)用場景,初學(xué)者多學(xué)習(xí) InnoDB 存儲引擎, InnoDB 存儲引擎也是在面試中問的最頻繁的存儲引擎了。本小節(jié)內(nèi)容只是簡單地介紹了這幾種存儲引擎,了解一下存儲引擎基礎(chǔ)知識,更深入的關(guān)于存儲引擎的知識就需要閱讀底層源碼了。