MySQL ARCHIVE存储引擎的测试

最近在看《高性能MySQL》(第三版)中提到的Archive存储引擎,书中提到

Archive存储引擎会缓存所有的写并利用zlib对插入进行压缩,所以比MyISAM表的磁盘I/O更少。但是每次SELECT查询都需要执行全表扫描。所以Arceive表适合日志和数据采集类应用...

该引擎的特点参见官方介绍。

考虑到最近也在做数据采集相关的系统,对该引擎结合自己的业务特点进行了考察。

测试PC配置如下:

MySQL ARCHIVE存储引擎的测试_第1张图片
系统配置.png

1.测试准备

  • 安装MySQL
    登陆MySQL,利用SHOW ENGINES 命令查看是否安装ARCHIVE引擎


    MySQL ARCHIVE存储引擎的测试_第2张图片
    展示存储引擎
  • 业务数据准备
    项目需要采集的数据基本分为两类,一类是枚举数据,枚举类型基本都是正常、故障等,类型个数在10个以内,另一类是数值数据,数据范围多数在1~10000以内。整个系统每秒大概需要采集1000个属性,按照平均5个属性为一行数据,系统每天工作10个小时计算,一天大概需要存储1000➗5✖️3600✖️10=7 200 000行数据。预备100万条随机枚举类型数据和数值类型数据进行测试。

  • 建立测试库
    执行脚本

drop database if exists archive_test;
create database archive_test;
use archive_test;
create table enumvalue (
    s0 TINYINT not null,
    s1 TINYINT not null,
    s2 TINYINT not null,
    s3 TINYINT not null,
    s4 TINYINT not null,
    t TIMESTAMP
) engine=archive default charset=utf8;

create table numbervalue (
    s0 SMALLINT not null,
    s1 SMALLINT not null,
    s2 SMALLINT not null,
    s3 SMALLINT not null,
    s4 SMALLINT not null,
    t TIMESTAMP
) engine=archive default charset=utf8;

2.存储测试

存储过程

drop PROCEDURE if exists repeat_enum_insert;
drop PROCEDURE if exists repeat_number_insert;
delimiter //
CREATE PROCEDURE repeat_enum_insert(in count INT)
BEGIN
    DECLARE icount INT default 0;
    DECLARE imax INT default 10;
    repeat 
        insert into enumvalue values(FLOOR(0 + (RAND() * imax)),FLOOR(0 + (RAND() * imax)),FLOOR(0 + (RAND() * imax)),FLOOR(0 + (RAND() * imax)),FLOOR(0 + (RAND() * imax)),NOW());
        set icount=icount+1;
    until icount > count end repeat;
END//
CREATE PROCEDURE repeat_number_insert(in count INT)
BEGIN
    DECLARE icount INT default 0;
    DECLARE imax INT default 10000;
    repeat 
        insert into numbervalue values(FLOOR(0 + (RAND() * imax)),FLOOR(0 + (RAND() * imax)),FLOOR(0 + (RAND() * imax)),FLOOR(0 + (RAND() * imax)),FLOOR(0 + (RAND() * imax)),NOW());
        set icount=icount+1;
    until icount > count end repeat;
END//
delimiter ;

分别执行以上两个存储过程

mysql> call repeat_enum_insert(1000000);
Query OK, 1 row affected (15.11 sec)
mysql> call repeat_number_insert(1000000);
Query OK, 1 row affected (15.62 sec)

完成随机数据的插入,插入时间在16s以内,效率非常可观。

3.存储测试结果

table_name 数据容量Mb 行数
enumvalue 2.8 1000000
numbervalue 10 1000000

4.结论

通过测试可以得出对于本系统枚举类型和数值类型一年的存储容量分别为2.8✖️72✖️365= 7.1GB和10✖️72✖️365=25.6GB,一般的服务器的存储能力应该都能满足该要求,也基本能够满足小型采集系统的要求,配合着mysql数据库已有的生态环境,能够比较容易的实现HA,数据备份,以及后期的统计分析等功能。

你可能感兴趣的:(MySQL ARCHIVE存储引擎的测试)