📢博客主页:https://blog.csdn.net/2301_779549673
📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨
文章目录
使用 ARCHIVE
存储引擎创建的表,存储大量不被索引的数据且占用空间很小,一般用于归档数据的存储。
🏳️🌈一、ARCHIVE 存储引擎的特性
- 支持
INSERT
,REPLACE
和SELECT
,但不支持DELETE
和UPDATE
- 支持列的
AUTO INCREMENT
属性,该列可以有唯一约束,且手动指定的值不能小于该列的最大值; - 不支持索引,在任何列上尝试建立索引都会报错;
- 插入时,数据将被压缩,
ARCHIVE
引擎使用zlib
无损数据压缩;INSERT
语句只是将数据写入压缩缓冲区并且根据需要刷新到磁盘,当执行SELECT
时会强制刷新缓冲区: - 检索时,按需要进行解压缩,不支持行缓存;
SELECT
操作执行全表扫描,找出当前查询的行,并读取行数;- 使用行级锁定
- 不支持表分区
🏳️🌈二、创建 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表进行插入操作,FIRST
或LAST
值分别表示在第一个或最后一个基础表中进行插入 - 如果没有指定
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表的替代方案可以使用表分区,可以支持主键索引,唯一索引,全文索引等,我们在分库分表与表分区专题中介绍
👥总结
本篇博文对 ? 做了一个较为详细的介绍,不知道对你有没有帮助呢
觉得博主写得还不错的三连支持下吧!会继续努力的~