archive储存引擎的应用场景就是它的名字的缩影,主要用于归档。archive储存引擎仅支持select和insert,最出众的是插入快,查询快,占用空间小。例如我们有大量的历史数据极少访问又不能删除,需要保存,那么它是非常不错的选择。archive最出名的就是压缩,它的引擎使用zlib无损数据压缩算法,压缩率非常好,这里测试下效果。
根据英文的测试结论来看,Archive表比MyISAM表要小大约75%,比支持事务处理的InnoDB表小大约83%。当数据量非常大的时候Archive的插入性能表现会较MyISAM为佳。
Archive表的性能是否可能超过MyISAM?答案是肯定的。根据MySQL工程师的资料,当表内的数据达到1.5GB这个量级,CPU又比较快的时候,Archive表的执行性能就会超越MyISAM表。因为这个时候,CPU会取代I/O子系统成为性能瓶颈。别忘了Archive表比其他任何类型的表执行的物理I/O操作都要少。
较小的空间占用也能在你移植MySQL数据的时候发挥作用。当你需要把数据从一台MySQL服务器转移到另一台的时候,Archive表可以方便地移植到新的MySQL环境,你只需将保存Archive表的底层文件复制过去就可以了。
文件系统存储特性
- 以zlib对表数据进行压缩,磁盘I/O更少(几Tinnodb表在archive中只需要几百兆)
- 数据存储在.ARZ为后缀的文件中
- .frm文件
功能特点
- 只支持insert、replace和select
- 支持行级锁和专用的缓存区,可实现高并发
- 只允许在自增ID列上加索引
- 支持分区,不支持事务处理
建立一张表
MySQL [test]> create table myarchive( id int auto_increment not null , c1 varchar(10),c2 char(10),key(id)) engine = archive;
Query OK, 0 rows affected (0.06 sec)
插入和查询数据
MySQL [test]> insert into myarchive (c1,c2) values ('aa','bb'),('cc','dd');
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
MySQL [test]> select * from myarchive;
+----+------+------+
| id | c1 | c2 |
+----+------+------+
| 1 | aa | bb |
| 2 | cc | dd |
+----+------+------+
2 rows in set (0.01 sec)
我们看到可以进行查询操作,现在看是否可以进行删除操作。
MySQL [test]> delete from myarchive where id = 1;
ERROR 1031 (HY000): Table storage engine for 'myarchive' doesn't have this option
更新操作
MySQL [test]> update myarchive set c1='aaaa' where id =1;
ERROR 1031 (HY000): Table storage engine for 'myarchive' doesn't have this option
我们接着查看是否可以在非自增键上创建索引
MySQL [test]> create index idx_c1 on myarchive(c1);
ERROR 1069 (42000): Too many keys specified; max 1 keys allowed
使用场景
是无法在OLTP类的应用中所使用的,因为它不支持对数据的修改,而OLTP中一定会对数据进行修改,对于一些数据仓库的应用,或者一些特殊的表,如:记录日志类的表或者数据采集的表,由于会要存储大量的数据,就比较适合Archive存储引擎,存储空间占用最小。
注意:即使是在日志采集和数据的应用中,Archive存储引擎也是无法进行数据的删除和更新的。