带你5分钟搞懂MySQL存储引擎

2,126 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

前言

在MySQL服务端处理客户端的请求时,到服务器程序完成了查询优化为止,还没有真正地去访问真实的表中数据,MySQL服务器把数据的存储和提取操作都封装到了一个名为存储引擎的模块中,这篇文章主要总结一下MySQL存储引擎是什么、常用的存储引擎及区别,以及常用的存储引擎操作,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。

存储引擎

MySQL中的数据通过不同的技术存储在文件(或者内存)中,这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定级别等不同的功能和能力,这些不同的技术以及配套的相关功能被称为存储引擎

存储引擎位于MySQL服务的第三层,如图示:

在物理上如何表示记录,怎么从表中读取数据,以及怎么把数据写入具体的物理存储器上,都是存储引擎负责的事情。

为了实现不同的功能,MySQL提供了不同的存储引擎,不同存储引擎管理的表可能有不同的存储结构,采用的存取算法也可能不同。我们可以根据自己的需求选择适用于服务器、数据库和表格的存储引擎。

常用存储引擎

MySQL提供了多种存储引擎,在这里只列出部分常见的 :

  • ARCHIVE:用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。
  • CSV:在存储数据时,会以逗号作为数据项之间的分隔符。
  • BLACKHOLE:会丢弃写操作,该操作会返回空内容。
  • FEDERATED:将数据存储在远程数据库中,用来访问远程表的存储引擎。
  • InnoDB:具备外键支持功能的事务处理引擎
  • MEMORY:置于内存的表
  • MERGE:用来管理由多个 MyISAM 表构成的表集合
  • MyISAM:主要的非事务处理存储引擎
  • NDB:MySQL 集群专用存储引擎

不同的存储引擎都有各自的特点,以适应不同的需求,我们来看一下这几种存储引擎的区别:

功 能MYISAMMemoryInnoDBArchive
存储限制256TBRAM64TBNone
支持事物
支持全文索引
支持数索引
支持哈希索引
支持数据缓存N/A
支持外键

存储引擎这么多,看着就让人头皮发麻, 我们怎么挑啊,其实大家多虑了,我们只需要掌握在开发中最常用的InnoDB和MyISAM就可以了,偶尔还会提一下MEMORY。其中MySQL5.5之后默认的存储引擎是InnoDB。

InnoDB和MyISAM区别

特点InnoDBMyISAM
存储格式表结构存在 .frm 文件中每个表的数据和索引单独保存在 .ibd 中。在磁盘存储成3个文件,其文件名都和表名相同,扩展名分别是.frm:存储数据表结构定义。.MYD:存储表数据。.MYI:存储表索引。
存储限制64TB
事务安全支持不支持
锁机制行锁表锁
B+tree索引支持支持
聚集索引
全文索引支持(5.6版本之后)支持
外键支持不支持

关于存储引擎的一些操作

查看存储引擎

# 查看当前的默认存储引擎:
mysql> show variables like "default_storage_engine";
# 查询当前数据库支持的存储引擎
mysql> show engines \G;

设置表的存储引擎

创建表时指定存储引擎

如果没有指定表的存储引擎,就会使用默认的存储引擎,我们可以显示的指定,格式如下:

CREATE TABLE 表名(

建表语句

) ENGINE = 存储引擎名称;

\

示例:

#创建表时指定存储引擎
mysql> create table engine_table_demo(id bigint(12),name varchar(200)) ENGINE=MyISAM; 
mysql> create table engine_table_demo2(id int(4),name varchar(50)) ENGINE=InnoDB;

修改表的存储引擎

如果已经建好的表,我们可以使用下面这个语句来修改表的存储引擎,格式如下:

ALERT TABLE 表名 ENGINE = 存储引擎名称;

示例如下:

# 修改一个已经存在的表的存储引擎。
mysql> alter table test engine = innodb;

小结

存储引擎主要负责读取和写入底层表中的数据,MySQL支持的存储引擎有好多种,它们的功能各有侧重,在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。

我们常用的就是InnoDB和MyISAM,其中MySQL5.5之后默认的存储引擎是InnoDB。

  • InnoDB: 是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。
  • MyISAM : 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。(类似需求一般用mongoDB)