MySQL 存儲(chǔ)引擎概述
MySQL 數(shù)據(jù)庫(kù)提供了獨(dú)有的插件式存儲(chǔ)引擎,常見(jiàn)存儲(chǔ)引擎有 InnoDB、MyISAM、NDB、Memory、Archive、Federated、Maria 等等,并且不同的存儲(chǔ)引擎有著完全不同的功能,建表的時(shí)候可以指定存儲(chǔ)引擎的類型,若不指定存儲(chǔ)引擎類型,MySQL8.0 默認(rèn)的存儲(chǔ)引擎就是 InnoDB。
1. InnoDB 存儲(chǔ)引擎
InnoDB 存儲(chǔ)引擎最大的特點(diǎn)是支持事務(wù),它主要應(yīng)用于事務(wù)(OLTP)相關(guān)的數(shù)據(jù)存儲(chǔ)。它的功能特點(diǎn)有行鎖、支持外鍵,并且一般操作查詢不會(huì)產(chǎn)生鎖。InnoDB 存儲(chǔ)引擎從 MySLQ 5.5.5 之后的版本都是其默認(rèn)的存儲(chǔ)引擎。
InnoDB 有多版本并發(fā)控制,并且有 4 種隔離級(jí)別,這種隔離級(jí)別分別為 順序讀(SERIALIZABLE)、可重復(fù)讀(REPEATABLE READ)、讀已提交(READ COMMITTED)、讀未提交(READ UNCOMMITTED)。
下面通過(guò)一個(gè)建表 sql 來(lái)新建一個(gè) InnoDB 存儲(chǔ)引擎類型的數(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表示建表指定存儲(chǔ)引擎類型為 InnoDB。
2. MyISAM 存儲(chǔ)引擎
MyISAM 存儲(chǔ)引擎是 MySQL 5.5.8 版本以前默認(rèn)使用的存儲(chǔ)引擎,其不支持事務(wù),MyISAM 存儲(chǔ)引擎表由 MYD 和 MYI 組成,其中 MYD 用來(lái)存放數(shù)據(jù)的文件,MYI 用來(lái)存放索引的文件。
下面通過(guò)一個(gè)建表 sql 來(lái)新建一個(gè) MyISAM 存儲(chǔ)引擎類型的數(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:注意:對(duì)于 MyISAM 存儲(chǔ)引擎, MySQL 數(shù)據(jù)庫(kù)只緩存索引文件,數(shù)據(jù)庫(kù)的數(shù)據(jù)文件由操作系統(tǒng)完成。
3. NDB 存儲(chǔ)引擎
NDB 存儲(chǔ)引擎是一個(gè)集群存儲(chǔ)引擎,其特點(diǎn)是數(shù)據(jù)全都存放在內(nèi)存中(可以將非索引的數(shù)據(jù)放在磁盤上),通過(guò)主鍵查找的速度非常快, NDB 存儲(chǔ)引擎的表連接操作(JOIN) 是由 MySQL Server 層完成的,其執(zhí)行速度比較慢。因 NDB 是一個(gè)集群存儲(chǔ)引擎,這里不方便做演示了。
4. MEMORY 存儲(chǔ)引擎
Memory 存儲(chǔ)引擎將表中的數(shù)據(jù)存放在內(nèi)存中,如果數(shù)據(jù)庫(kù)發(fā)生 崩潰(crash)或者重啟,則表中的數(shù)據(jù)會(huì)丟失。
下面通過(guò)一個(gè)建表 sql 來(lái)新建一個(gè) MyISAM 存儲(chǔ)引擎類型的數(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 存儲(chǔ)引擎
ARCHIVE 存儲(chǔ)引擎只支持 INSERT插入和 SELECT 查詢 操作,這就意味著插入進(jìn)去的數(shù)據(jù)不能更改,所以 ARCHIVE 存儲(chǔ)引擎非常適合存儲(chǔ)歸檔數(shù)據(jù)。
下面通過(guò)一個(gè)建表 sql 來(lái)新建一個(gè) ARCHIVE 存儲(chǔ)引擎類型的數(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 存儲(chǔ)引擎使用行鎖來(lái)實(shí)現(xiàn)高并發(fā)的寫入操作,但其本身不是 crash safe 的存儲(chǔ)引擎。
6. FEDERATED 存儲(chǔ)引擎
FEDERATED 存儲(chǔ)引擎不存放數(shù)據(jù),它指向遠(yuǎn)程 MySQL 數(shù)據(jù)庫(kù)。本地只存放表的機(jī)構(gòu)信息,數(shù)據(jù)都通過(guò)遠(yuǎn)程連接存放到遠(yuǎn)程服務(wù)器,增刪改查操作都是通過(guò)建立的連接來(lái)訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)進(jìn)行操作,把結(jié)果返回給本地。FEDERATED 存儲(chǔ)引擎默認(rèn)是不開(kāi)啟的,可以先查看所有存儲(chǔ)引擎開(kāi)啟狀態(tài):
SHOW ENGINES;
執(zhí)行結(jié)果如下 :

Tips:若 FEDERATED 存儲(chǔ)引擎沒(méi)有啟用,可以在 MySQL 配置文件中 [mysqld] 下面增加一行 federated,然后重啟 MySQL 即可開(kāi)啟。
下面通過(guò)一個(gè)建表 sql 來(lái)新建一個(gè) FEDERATED 存儲(chǔ)引擎類型的數(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 存儲(chǔ)引擎
MARIA 存儲(chǔ)引擎是一種比較新的存儲(chǔ)引擎,是為了取代原有的 MyISAM 存儲(chǔ)引擎,可以理解為 MyISAM 存儲(chǔ)引擎的后續(xù)版本。MARIA 存儲(chǔ)引擎的特點(diǎn)是支持?jǐn)?shù)據(jù)和文件索引,應(yīng)用了行鎖設(shè)計(jì),提供了多版本并發(fā)控制(MVCC),支持事務(wù)。
8. CSV 存儲(chǔ)引擎
邏輯上由逗號(hào)分割數(shù)據(jù)的存儲(chǔ)引擎。它會(huì)在數(shù)據(jù)庫(kù)子目錄里為每個(gè)數(shù)據(jù)表創(chuàng)建一個(gè).CSV文件。這是一種普通文本文件,每個(gè)數(shù)據(jù)行占用一個(gè)文本行。CSV存儲(chǔ)引擎不支持索引。
9. 小結(jié)
本小節(jié)介紹了 8 種存儲(chǔ)引擎, MySQL 還提供了很多其他的存儲(chǔ)引擎,例如 Merge、Sphinx、Infobright,它們分別有各自合適的應(yīng)用場(chǎng)景,初學(xué)者多學(xué)習(xí) InnoDB 存儲(chǔ)引擎, InnoDB 存儲(chǔ)引擎也是在面試中問(wèn)的最頻繁的存儲(chǔ)引擎了。本小節(jié)內(nèi)容只是簡(jiǎn)單地介紹了這幾種存儲(chǔ)引擎,了解一下存儲(chǔ)引擎基礎(chǔ)知識(shí),更深入的關(guān)于存儲(chǔ)引擎的知識(shí)就需要閱讀底層源碼了。
愛(ài)因詩(shī)賢 ·
2025 imooc.com All Rights Reserved |