【MySQL】存储引擎 - ARCHIVE、BLACKHOLE、MERGE详解

发布于:2025-05-09 ⋅ 阅读:(15) ⋅ 点赞:(0)

📢博客主页:https://blog.csdn.net/2301_779549673
📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述


使用 ARCHIVE 存储引擎创建的表,存储大量不被索引的数据且占用空间很小,一般用于归档数据的存储。

🏳️‍🌈一、ARCHIVE 存储引擎的特性

在这里插入图片描述

  1. 支持 INSERTREPLACESELECT,但不支持 DELETEUPDATE
  2. 支持列的 AUTO INCREMENT 属性,该列可以有唯一约束,且手动指定的值不能小于该列的最大值;
  3. 不支持索引,在任何列上尝试建立索引都会报错;
  4. 插入时,数据将被压缩,ARCHIVE 引擎使用 zlib 无损数据压缩; INSERT 语句只是将数据写入压缩缓冲区并且根据需要刷新到磁盘,当执行 SELECT 时会强制刷新缓冲区:
  5. 检索时,按需要进行解压缩,不支持行缓存;
  6. SELECT 操作执行全表扫描,找出当前查询的行,并读取行数;
  7. 使用行级锁定
  8. 不支持表分区

🏳️‍🌈二、创建 ARCHIVE 表

在MySQL 8.0中 InnoDB 是默认引擎,所以在创建表时需要指定 ENGINE=ARCHIVE

# 创建⼀个使⽤ARCHIVE存储引擎的表
CREATE TABLE t_archive (
	id int(11) UNIQUE AUTO_INCREMENT,
	name varchar(20)
) ENGINE = ARCHIVE;

创建 ARCHIVE 表会根据表名生成两个不同后缀名文件,

  • 分别是以 .ARZ 为后缀的数据文件,
  • .sdi 为后缀的表信息描述文件(JSON格式),
  • .ARN 文件在优化操作期间可能会出现。

在这里插入图片描述

🏳️‍🌈三、BLACKHOLE 存储引擎的特性

BLACKHOLE 存储引擎就像⼀个"⿊洞",接受数据,但不存储数据,检索时总是返回⼀个空结果

  • BLACKHOLE 表不会存储任何数据,但如果启用了基于语句的二进制日志记录,则会记录 SQL语句并将其复制到副本服务器
  • 支持索引;
  • 不支持分区;

🏳️‍🌈四、BLACKHOLE 存储引擎的用途

  • 验证转储⽂件语法
  • 通过⽐较启⽤和不启⽤⼆进制⽇志记录的性能,测量⼆进制⽇志记录的开销;
  • 本质上是⼀个 "⽆操作"的存储引擎,可⽤于查找与存储引擎本⾝⽆关的性能瓶颈

🏳️‍🌈五、创建BLACKHOLE表

  • 在MySQL 8.0中 InnoDB 是默认引擎,所以在创建表时需要指定 ENGINE=BLACKHOLE
  • 创建 BLACKHOLE 表时,服务器会在全局数据字典中创建表定义并⽣成 .sdi 为后缀的表信息描述⽂件
mysql> CREATE TABLE t_blackhole(id INT, content CHAR(10)) ENGINE = BLACKHOLE;
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO t_blackhole VALUES(1,'record one'),(2,'record two');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM t_blackhole;
Empty set (0.00 sec)

在这里插入图片描述

🏳️‍🌈六、MERGE 存储引擎特性

MERGE 存储引擎,也称为 MRG_MyISAM 引擎,允许MySQL DBA或开发⼈员在逻辑上将⼀系列相同的MyISAM表分组,并将它们作为⼀个对象引⽤。适⽤于VLDB(Very Large Data Bases)环境,如数据仓库。这里的相同表示所有表中的列都有相同的数据类型和索引信息。

⽰意图如下

在这里插入图片描述

🏳️‍🌈七、创建MERGE表

  • 在MySQL8.0中 InnoDB 是默认引擎,所以在创建表时需要指定 ENGINE=MERGE
  • 创建MERGE表必须指定 UNION=(list-of-tables) 选项,表示要使用哪些MyISAM表;
  • 还可以通过指定 INSERT_METHOD 选项来控制如何对MERGE表进行插入操作,FIRSTLAST 值分别表示在第一个或最后一个基础表中进行插入
  • 如果没有指定 INSERT_METHOD 选项,或者指定它的值为 NO ,那么在 MERGE 表中执行插入将会报错;
# 创建基础表1
mysql> CREATE TABLE test_m1 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
content CHAR(20)) ENGINE=MyISAM;

# 创建基础表2
mysql> CREATE TABLE test_m2 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
content CHAR(20)) ENGINE=MyISAM;

# 向基础表中写⼊数据
mysql> INSERT INTO test_m1 (content) VALUES ('Testing1'),('table1'),('test_m1');
mysql> INSERT INTO test_m2 (content) VALUES ('Testing2'),('table2'),('test_m2');

# 创建MERGE表
mysql> CREATE TABLE t_merge (
id INT NOT NULL AUTO_INCREMENT,
content CHAR(20), INDEX(id))
ENGINE=MERGE UNION=(test_m1,test_m2) INSERT_METHOD=LAST;

创建 MERGE 表时,会在磁盘上创建一个.mrg 文件,其中包含了基础MyISAM表的名称。
MERGE的表格式存储在MySOL数据字典中;
.sdi 为后缀的表信息描述文件;

在这里插入图片描述
在这里插入图片描述

🏳️‍🌈八、操作 MERGE 表

基础表中的 id 列作为 PRIMARY KEY 索引,但在MERGE表中并不作为主键,但是可以被索引。

因为 MERGE 表不能对基础表集强制唯一性,类似的,基础表中具有 UNIOUE 索引的列可以在 MERGE 表中被索引,但不能作为唯一约束

查询示例:

mysql> select * from t_merge;
+----+----------+
| id | content  |
+----+----------+
|  1 | Testing1 |
|  2 | table1   |
|  3 | test_m1  |
|  1 | Testing2 |
|  2 | table2   |
|  3 | test_m2  |
+----+----------+
6 rows in set (0.00 sec)

要将MERGE表重新映射到不同的MyISAM基础表集合,您可以使用以下方法之一

  • 删除 MERGE 表并重新创建:。
  • 使用 ALTER TABLE tbl name UNION=(..) 修改基础表的集合;
  • ALTER TABLE…UNION=()列表为空时,表示删除所有基础表

使用 DROP TABLE 只会删除 MERGE 表定义,基础 MyISAM 表不受影响。

关于MERGE表的替代方案可以使用表分区,可以支持主键索引,唯一索引,全文索引等,我们在分库分表与表分区专题中介绍


👥总结

本篇博文对 ? 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~


网站公告

今日签到

点亮在社区的每一天
去签到