侧边栏壁纸
  • 累计撰写 7 篇文章
  • 累计创建 7 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

MySQL各个存储引擎的对比

小白
2023-09-12 / 0 评论 / 0 点赞 / 67 阅读 / 29370 字

众所周知MySQL在创建表的时候是可以选定存储引擎的,不同的存储引擎特性和性能有很大的差别。虽然大多数或者默认来说都是使用InnoDB,那我们还是应该要知道他们之间的差别在以后的一些场景也许用得上,并且呀也算是面试八股文的一项呀那必须得记下来说不一定以后还要时不时拿出来背呢哈哈哈哈哈!数据库版本是MySQL8.0,这很可能与前面的特别是比较经典的5.7版本不太一样。

可以使用命令show engines 查看数据库支持的引擎,并且后面可以看到是否支持事务以及XA事务等信息

如图可以看到标明了当前支持的引擎以及是否支持TransactionsXA、以及Savepoints

Transactions 好理解就是普通事务,XA是指XA规范(XA Specification)主要来实现分布式事务,Savepoints是指在事务中可以设置多个保存点然后可以回退到指定的保存点而不是回滚整个事务

MEMORY

特征

支持

B树索引

备份/时间点恢复(在服务器中实现,而不是在存储引擎中实施。

群集数据库支持

聚集索引

压缩数据

数据缓存

不适用

加密数据

是(通过加密功能在服务器中实现。

外键支持

全文搜索索引

地理空间数据类型支持

地理空间索引支持

哈希索引

索引缓存

不适用

锁粒度

MVCC

复制支持(在服务器中实现,而不是在存储引擎中实现。

有限*

存储限制

依RAM而定

T 树索引

事务

更新数据字典的统计信息

当然依旧是适用DDL和DML语句的,和普通的SQL语句别无二致

-- 创建表
CREATE TABLE memory_table (
	id INT auto_increment NOT NULL,
	name varchar(100) NOT NULL,
	score INT NULL,
	PRIMARY KEY (`id`)
)ENGINE=MEMORY

-- 插入数据
INSERT INTO memory_table (name,`score`)
	VALUES ('lisi',61);

-- 更新数据
UPDATE test.memory_table
	SET score=71
	WHERE id=1;

-- 删除数据
DELETE FROM test.memory_table
	WHERE id=1;

MEMORY模式是将数据存储在内存中,存储引擎本身不会创建任何存储在磁盘上面的文件表定义是存储在MySQL的数据字典(SDI)中,我相信这速度应该是很快的,但是要注意它的锁粒度,并且当MySQL服务重启之后数据就不存在了。

值得注意的是MEMORY使用的是固定长度列,那些可变长度在实际存储时使用的是固定长度如varchar。并且不支持blobtext类型。

必须要注意的是MEMORY表的大小受max_heap_table_size变量的控制这个变量默认是16777216单位是bytes可接受的最小值是16384,64位操作系统可接受的最大值是18446744073709550592

如果到了上限再插入数据会提示The table 'memory_table1' is full

PERFORMANCE_SCHEMA

PERFORMANCE_SCHEMA主要是检查和收集事件数据存储到数据库表中可以向使用其他表一样使用select查询,也可以对它进行更新,影响数据收集的相关配置。它默认是打开的,你也可以在my.cnf中配置performance_schema=ON关闭它这个模式下的表是存储在内存中的,在服务关闭之后数据将消失,在服务启动之后又开始填充新数据,并且我们是不能创建这个引擎的数据表的,并且它相关的数据收集存储是写到代码中的,我理解就是代码里面写死的写入某个库某个表,相当于是mysql的一种日志,为了方便给用户看所以做成这种形式。把这种机制的表的引擎较为PERFORMANCE_SCHEMA

如图PERFORMANCE_SCHEMA引擎不让用户创建提示Invalid performance_schema usage.

MyISAM

特征

支持

B树索引

备份/时间点恢复(在服务器中实现,而不是在存储引擎中实施。

群集数据库支持

聚集索引

压缩数据

是(仅当使用压缩行格式时,才支持压缩的MyISAM表。使用MyISAM压缩行格式的表是只读的。

数据缓存

加密数据

是(通过加密功能在服务器中实现。

外键支持

全文搜索索引

地理空间数据类型支持

地理空间索引支持

哈希索引

索引缓存

锁粒度

MVCC

复制支持(在服务器中实现,而不是在存储引擎中实现。

存储限制

256TB

T 树索引

事务

更新数据字典的统计信息

MyISAM引擎的表会在磁盘存储两个以表名为名称文件,.MYI的索引文件,.MYD数据文件,表结构存储在字典表。

要注意的是在MySQLMyISAM不支持分区了

单表最大支持18440000000000000000(1.844E+19)行

最多64个索引,每个索引最多16个列

MRG_MYISAM

MRG_MYISAM也叫MERGE就是合并两个MYISAM引擎的表可以弥补MYISAM不支持分区的问题,操作MRG_MYISAM的表其实就是其合并的MYISAM的表

-- 先创建两个MYISAM的表
CREATE TABLE myisam_t1 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(20)) ENGINE=MyISAM;
CREATE TABLE myisam_t2 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(20)) ENGINE=MyISAM;
-- 然后插入数据
INSERT INTO test.myisam_t1 (name)
	VALUES ('name101');
INSERT INTO test.myisam_t2 (name)
	VALUES ('name201');

-- 然后用MRG_MYISAM引擎合并两个表
CREATE TABLE mrgmyisam_table (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
       name CHAR(20))
       ENGINE = MERGE
UNION =(myisam_t1,myisam_t2) INSERT_METHOD=LAST;

创建表的时候需要指定INSERT_METHODFIRSTLAST表示对表mrgmyisam_table插入数据时是从表的前面还是后面插入,也就是插入到myisam_t1表还是myisam_t2

查询mrgmyisam_table表数据可以发现查询出来了合并的两张表的数据

BLACKHOLE

哇黑洞!听起来就很厉害是不是所有存进去的东西都会被吃掉?

没错BLACKHOLE引擎的表所有存储进去的数据都会被丢弃,查询不出来任何数据,但是值得注意的是你如果开启了BinLog那么对数据的写入是会记录日志的,当然因为不会存储数据自然UpdateDelete的触发器不会被触发了。所以这种引擎有被用来做基于BinLog的同步因为它不存储表所以本身的消耗比较小。

CSV

CSV引擎可以理解为使用SQLCSV文件,因为没有SQL对数据的存储是CSV文件,你将数据insert之后就可以马上从CSV文件读取到数据。单数mysql还会创建一个表名的CSM文件存储表的状态和表的行数

ARCHIVE

特征

支持

B树索引

备份/时间点恢复(在服务器中实施,而不是在存储引擎中实施。

群集数据库支持

聚集索引

压缩数据

数据缓存

加密数据

是(通过加密功能在服务器中实现。

外键支持

全文搜索索引

地理空间数据类型支持

地理空间索引支持

哈希索引

索引缓存

锁粒度

MVCC

复制支持(在服务器中实现,而不是在存储引擎中实现。

存储限制

T 树索引

事务

更新数据字典的统计信息

这是一个很节省存储空间的引擎,就像他的名字那样他适合做存档使用,因此它是不支持删除和更新操作的,但是支持REPLACE操作,它不支持索引,没有单独的索引文件所以占用的空间比较小,但是要注意的是在AUTO_INCREMENT的列支持主键索引和联合主键索引。

值得注意的是ARCHIVE的表不支持分区,并且insert的数据是先写入缓冲区,并且是根据需要进行刷新,select操作会强制刷新,但是批量插入时可能会有一点不同,select不会强制刷新批量insert的数据,只有insert完成之后才会刷新,如果批量insert的同时有普通insert那还是可以实现刷新效果的。

总的来说ARCHIVE确实如其名很适合做不修改的存档表,数据类型支持比较完整,有类似需求可以一试,当然不支持事务、索引等。如果不是和其它引擎比较而是和其他数据相关产品比较那么我觉得竞争力也很弱。

InnoDB

重磅来了,这才是主要的引擎

特征

支持

B树索引

备份/时间点恢复(在服务器中实施,而不是在存储引擎中实施。

群集数据库支持

聚集索引

压缩数据

数据缓存

加密数据

是(通过加密功能在服务器中实现;在 MySQL 5.7 及更高版本中,支持静态数据加密。

外键支持

全文搜索索引

是(MySQL 5.6及更高版本支持全文索引。

地理空间数据类型支持

地理空间索引支持

是(MySQL 5.7及更高版本中提供对地理空间索引的支持。

哈希索引

否(InnoDB在内部利用哈希索引来实现其自适应哈希索引功能。

索引缓存

锁定粒度

MVCC

复制支持(在服务器中实现,而不是在存储引擎中实现。

存储限制

64TB

T 树索引

事务

更新数据字典的统计信息

对于OLTP业务这肯定是不二之选,甚至感觉这是主产品。其他的引擎是附赠品,能够提供一些情况下的一些使用。

基本完整的功能支持行级的锁粒度、良好的事务支持,在上面的引擎里面可以看出这是唯一的选择,同时还有Online DDL、优秀的索引及缓存支持让它的易用性也得到提升。

这是一张来自官网的InnoDB的架构图

InnoDB 架构图显示了内存和磁盘结构。内存中结构包括缓冲池、自适应哈希索引、更改缓冲区和日志缓冲区。磁盘结构包括表空间、重做日志和双重写入缓冲区文件。InnoDB很常用,网上的大多数的讲解也是基于InnoDB的,后续有机会再单独的对其某个功能或者机制进行探索。

参考

XA Specification

max_heap_table_size

Alternative Storage Engines

MySQL Performance Schema

InnoDB Architecture

0

评论区