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

【StoneDB-快速上手】- StoneDB 快速入门

原创 Winter 2022-07-26
911

本文的目的是通过简单的演示,让使用者体验StoneDB在大批量数据插入、数据压缩比和分析查询方面与InnoDB相比具有较高的性能。

第一步. 部署试用环境

在试用 StoneDB 功能前,请按照快速部署中的步骤准备 StoneDB 测试环境并启动实例。

第二步. 准备测试数据

通过以下步骤,将生成一个测试数据集用于体验 StoneDB 功能。

1) 前提条件

在同一个测试环境,分别创建StoneDB和InnoDB存储引擎的表,并且以下三个参数也是相同的。

autocommit=1

innodb_flush_log_at_trx_commit=1

sync_binlog=0

2)创建数据库

创建名为test的数据库

create database test DEFAULT CHARACTER SET utf8mb4;

3) 创建表

在test数据库内创建名为t_user的表

use test
CREATE TABLE t_user(
  id INT NOT NULL AUTO_INCREMENT,
  first_name VARCHAR(20) NOT NULL,
  last_name VARCHAR(20) NOT NULL,
  sex VARCHAR(5) NOT NULL,
  score INT NOT NULL,
  copy_id INT NOT NULL,
  PRIMARY KEY (`id`)
) engine=STONEDB;

4) 创建存储过程

执行以下 SQL 语句创建存储过程

DELIMITER //
create PROCEDURE add_user(in num INT)
BEGIN
DECLARE rowid INT DEFAULT 0;
DECLARE firstname VARCHAR(10);
DECLARE name1 VARCHAR(10);
DECLARE name2 VARCHAR(10);
DECLARE lastname VARCHAR(10) DEFAULT '';
DECLARE sex CHAR(1);
DECLARE score CHAR(2);
WHILE rowid < num DO
SET firstname = SUBSTRING(md5(rand()),1,4); 
SET name1 = SUBSTRING(md5(rand()),1,4); 
SET name2 = SUBSTRING(md5(rand()),1,4); 
SET sex=FLOOR(0 + (RAND() * 2));
SET score= FLOOR(40 + (RAND() *60));
SET rowid = rowid + 1;
IF ROUND(RAND())=0 THEN 
SET lastname =name1;
END IF;
IF ROUND(RAND())=1 THEN
SET lastname = CONCAT(name1,name2);
END IF;
insert INTO t_user(first_name,last_name,sex,score,copy_id) VALUES (firstname,lastname,sex,score,rowid);  
END WHILE;
END //
DELIMITER ;

此存储过程用于随机生成一张人员信息表。

第三步. 插入性能测试

执行以下SQL语句调用存储过程

mysql> call add_user_innodb(10000000);
Query OK, 1 row affected (24 min 46.62 sec)

mysql> call add_user(10000000);
Query OK, 1 row affected (9 min 21.14 sec)

结果显示:插入1千万数据行,在StoneDB需要9分钟21秒,在InnoDB需要24分钟46秒。

第四步. 数据压缩测试

通过以下SQL语句验证数据压缩性能

mysql> select count(*) from t_user_innodb;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (1.83 sec)

mysql> select count(*) from t_user;       
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (0.00 sec)

+--------------+---------------+------------+-------------+--------------+------------+---------+
| table_schema | table_name    | table_rows | data_length | index_length | total_size | engine  |
+--------------+---------------+------------+-------------+--------------+------------+---------+
| test         | t_user        |   10000000 | 119.99M     | 0.00M        | 119.99M    | STONEDB |
| test         | t_user_innodb |    9995867 | 454.91M     | 0.00M        | 454.91M    | InnoDB  |
+--------------+---------------+------------+-------------+--------------+------------+---------+

结果显示:相同的数据行,在StoneDB大小为120M,在InnoDB大小为455M。

第五步. 聚合查询测试

通过以下语句执行聚合查询测试

mysql> select first_name,count(*) from t_user group by first_name order by 1; 
+------------+----------+
| first_name | count(*) |
+------------+----------+
.....
| fffb       |      142 |
| fffc       |      140 |
| fffd       |      156 |
| fffe       |      140 |
| ffff       |      132 |
+------------+----------+
65536 rows in set (0.98 sec)

mysql> select first_name,count(*) from t_user_innodb group by first_name order by 1;
+------------+----------+
| first_name | count(*) |
+------------+----------+
......
| fffb       |      178 |
| fffc       |      161 |
| fffd       |      170 |
| fffe       |      156 |
| ffff       |      139 |
+------------+----------+
65536 rows in set (9.00 sec)

结果显示:执行相同的聚合查询,在StoneDB需要0.98s,在InnoDB需要9s。

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

评论