暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

MySQL的存储引擎之Archive

原创 巩飞 2020-03-03
2633

Archive引擎生成特殊用途的表,这些表将大量数据存储在非常小的空间中。
MySQL 5.7中Archive引擎的特性如下

Feature Support
B-tree indexes No
Backup/point-in-time recovery (Implemented in the server, rather than in the storage engine.) Yes
Cluster database support No
Clustered indexes No
Compressed data Yes
Data caches No
Encrypted data Yes (Implemented in the server via encryption functions.)
Foreign key support No
Full-text search indexes No
Geospatial data type support Yes
Geospatial indexing support No
Hash indexes No
Index caches No
Locking granularity Row
MVCC No
Replication support (Implemented in the server, rather than in the storage engine.) Yes
Storage limits None
T-tree indexes No
Transactions No
Update statistics for data dictionary Yes

创建Archive表时,MySQL在数据库目录中

  • 创建表格式文件,文件名以表名开头,扩展名为.frm。
  • 创建其它文件,均以表名开头,扩展名为.ARZ。优化操作期间可能会出现.ARN文件。
root@database-one 18:43: [gftest]> create table testArchive(eno int,ename varchar(10),age int,sal decimal(10,2),hiredate date,deptno int) engine=archive; Query OK, 0 rows affected (0.27 sec) root@database-one 18:44: [gftest]> exit Bye [root@database-one ~]# cd /home/mysql/gftest/ [root@database-one gftest]# ls -l testarchive* -rw-r----- 1 mysql mysql 8806 3月 2 18:44 testarchive.ARZ -rw-r----- 1 mysql mysql 8718 3月 2 18:44 testarchive.frm

大量插入数据,看看Archive表的数据压缩效果。

root@database-one 18:50: [gftest]> insert into emp_copy(ename,age,sal,hiredate,deptno) select ename,age,sal,hiredate,deptno from emp_copy; Query OK, 40 rows affected (0.01 sec) Records: 40 Duplicates: 0 Warnings: 0 root@database-one 18:50: [gftest]> insert into emp_copy(ename,age,sal,hiredate,deptno) select ename,age,sal,hiredate,deptno from emp_copy; Query OK, 80 rows affected (0.00 sec) Records: 80 Duplicates: 0 Warnings: 0 root@database-one 18:51: [gftest]> insert into emp_copy(ename,age,sal,hiredate,deptno) select ename,age,sal,hiredate,deptno from emp_copy; Query OK, 160 rows affected (0.00 sec) Records: 160 Duplicates: 0 Warnings: 0 root@database-one 18:51: [gftest]> insert into emp_copy(ename,age,sal,hiredate,deptno) select ename,age,sal,hiredate,deptno from emp_copy; Query OK, 320 rows affected (0.11 sec) Records: 320 Duplicates: 0 Warnings: 0 root@database-one 18:51: [gftest]> insert into emp_copy(ename,age,sal,hiredate,deptno) select ename,age,sal,hiredate,deptno from emp_copy; Query OK, 640 rows affected (0.01 sec) Records: 640 Duplicates: 0 Warnings: 0 root@database-one 18:51: [gftest]> insert into emp_copy(ename,age,sal,hiredate,deptno) select ename,age,sal,hiredate,deptno from emp_copy; Query OK, 1280 rows affected (0.02 sec) Records: 1280 Duplicates: 0 Warnings: 0 root@database-one 18:51: [gftest]> insert into emp_copy(ename,age,sal,hiredate,deptno) select ename,age,sal,hiredate,deptno from emp_copy; Query OK, 2560 rows affected (0.03 sec) Records: 2560 Duplicates: 0 Warnings: 0 root@database-one 18:51: [gftest]> insert into emp_copy(ename,age,sal,hiredate,deptno) select ename,age,sal,hiredate,deptno from emp_copy; Query OK, 5120 rows affected (0.11 sec) Records: 5120 Duplicates: 0 Warnings: 0 root@database-one 18:51: [gftest]> insert into emp_copy(ename,age,sal,hiredate,deptno) select ename,age,sal,hiredate,deptno from emp_copy; Query OK, 10240 rows affected (0.23 sec) Records: 10240 Duplicates: 0 Warnings: 0 root@database-one 18:51: [gftest]> select count(*) from emp_copy; +----------+ | count(*) | +----------+ | 20480 | +----------+ 1 row in set (0.01 sec) root@database-one 18:51: [gftest]> insert into testarchive select * from emp_copy; Query OK, 20480 rows affected (0.08 sec) Records: 20480 Duplicates: 0 Warnings: 0 root@database-one 18:51: [gftest]> select count(*) from testarchive; +----------+ | count(*) | +----------+ | 20480 | +----------+ 1 row in set (0.00 sec) root@database-one 18:52: [gftest]> commit; Query OK, 0 rows affected (0.00 sec) root@database-one 18:52: [gftest]> exit Bye [root@database-one gftest]# cd /home/mysql/gftest/ [root@database-one gftest]# ls -l emp_copy* testarchive* -rw-r----- 1 mysql mysql 8718 2月 13 22:00 emp_copy.frm -rw-r----- 1 mysql mysql 9437184 3月 2 18:51 emp_copy.ibd -rw-r----- 1 mysql mysql 58566 3月 2 18:52 testarchive.ARZ -rw-r----- 1 mysql mysql 8718 3月 2 18:49 testarchive.frm

从上面可以看到,同样的数据量,Archive引擎使用的空间仅占InnoDB引擎的0.621%,真是天壤之别啊。

为了极致性能,Archive引擎也付出了巨大的代价,比如支持INSERT、REPLACE和SELECT,但是不支持DELETE 和UPDATE。

root@database-one 19:19: [gftest]> delete from testarchive; ERROR 1031 (HY000): Table storage engine for 'testarchive' doesn't have this option root@database-one 19:19: [gftest]> update testarchive set sal=sal+100; ERROR 1031 (HY000): Table storage engine for 'testarchive' doesn't have this option root@database-one 19:19: [gftest]> select count(*) from testarchive; +----------+ | count(*) | +----------+ | 20480 | +----------+ 1 row in set (0.01 sec) root@database-one 19:21: [gftest]> insert into testarchive values(9999,'xiaowang',23,8000,'2020-3-2',10); Query OK, 1 row affected (0.03 sec) root@database-one 19:21: [gftest]> select count(*) from testarchive; +----------+ | count(*) | +----------+ | 20481 | +----------+ 1 row in set (0.06 sec)

所以,Archive表非常适合用于冷数据归档的场景。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论