MySQL ARCHIVE存儲引擎的測試

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

Archive存儲引擎會緩存所有的寫并利用zlib對插入進行壓縮,所以比MyISAM表的磁盤I/O更少。但是每次SELECT查詢都需要執行全表掃描。所以Arceive表適合日志和數據采集類應用...

該引擎的特點參見官方介紹。

考慮到最近也在做數據采集相關的系統,對該引擎結合自己的業務特點進行了考察。

測試PC配置如下:

系統配置.png

1.測試準備

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


    展示存儲引擎
  • 業務數據準備
    項目需要采集的數據基本分為兩類,一類是枚舉數據,枚舉類型基本都是正常、故障等,類型個數在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,數據備份,以及后期的統計分析等功能。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容