百万级海量数据内存数据库和数据库的性能对比

最近公司准备把内存数据库和数据库换成国产的数蚕数据库。老大让我来测试一下性能。周末正好加个小班小试了一下。

 

环境准备:

官方提供的包括的linux和windows平台专业版各一套。我这里测试是windows平台使用Windows 10系统。

 

开发机器:CPU i7 8700, 内存 16G, 256G固态盘。

 

数据准备:

使用100000,1000000条包含整数类型,浮点类型,日期类型,字符串类型的数据,其中name,date,value含有重复值。构造的数据表为id,name,date,value的字段表。


内存数据库

测试内容包含:插入查询

插入分别使用insert, sql文件和import功能。

 

这个数据库的sql和标准有一些不太一致的地方,还好在线文档写得很清晰,过了一遍就大概齐了解区别了。

 

运行sct_local_mem.exe,或者运行sct_s_mem.exe再运行sct_c_mem.exe连接服务端。

以下测试在sct_local_mem.exe上,经测试通过网络速度对这部分插入测试几乎没有影响。

 

首先构造数据表

 

create table test(id u32(false), name string(true), date date(true), value float(true));

 

insert使用数据库序列函数seq可以直接生成序列。

 

insert into test (id, name, date, value) select seq(100000), constants("张三",100000), constants (date(),100000), seq(100000)+1.0;

执行时间:

execute time: 743390 us                134518条每秒

 

使用

select "insert into test (id,name,date,value) values(" + x2str(id) + ",\"" + name + "\",\"" + x2str(date) + "\"," + x2str(value) + ");" as sql from test export as csv path="test.sql";

生成sql文件。去除第一行

Sql文件内容为100000行

insert into test(id, name, date, value) values(0,"张三","2020-11-12",1.000000);

insert into test(id, name, date, value) values(1,"张三","2020-11-12",2.000000);

insert into test(id, name, date, value) values(2,"张三","2020-11-12",3.000000);

insert into test(id, name, date, value) values(3,"张三","2020-11-12",4.000000);
…

 

 

使用exec 执行sql文件

exec "test.sql"

 

执行时间:

execute time: 12597752 us           7938条每秒

 

 

 

使用import加载csv时间

select * from test export as csv path="test.csv";



import test from csv path="test.csv";

 

执行时间:

execute time: 875321 us            114285条每秒

 

对应百万结果:

insert select 时间: execute time: 7906557 us            126422 条每秒

exec 时间: execute time: 125150944 us                7990条每秒

import time: execute time: 9379922 us                 106610 条每秒

 

大体上可以看出时间上是亚线性关系稳定的增加。

 

 

查询测试(仅在1000000数据下):

      

select id,date from test where first 100;

execute time: 447 us

 

select id,date from test where first 10000;

execute time: 7067 us

 

select id,date from test where id==10000;

execute time: 345 us

 

查询速度可以媲美nosql数据库

 


硬盘数据库

 

构造表

create table test(id u32(false), name string16(true), date date(true), value float(true));

 

insert插入数据

insert into test (id, name, date, value) select seq(100000), constants(“张三”,100000), constants (date(),100000), seq(100000)+1.0;

 

执行时间:

execute time: 247098217 us                 平均404条每秒

 

exec sql执行时间:

exec "test.sql";

 

execute time: 274124784 us                 平均364条每秒

 

数据无import命令使用load命令替代

load test from csv path="test.csv";

 

load执行时间:

execute time: 2055357 us                   平均48543 条每秒

 

百万insert和exec时间比较长就没有测试,只测试load

load执行时间:

execute time: 18544048 us                  平均54054条每秒

 

查询测试(仅在1000000数据下):

      

select id,date from test where first 100;

execute time: 1256 us

 

select id,date from test where first 10000;

execute time: 59253 us

 

select id,date from test where id==10000;

execute time: 465 us


结论

整体看对比内存数据库硬盘直接insert语句插入速度慢了20倍左右。

load/import导入数据比内存数据库只慢了一倍左右。

查询速度少量查询慢了约一倍,查询越多速度慢的越多。

 

内存数据库速度上优势很明显,数据库产品整体上性能比较稳定,查询性能非常出色。适合多读少写的业务场景。

 

 

更新一下:

后来技术服务人员告诉我们说插入是默认不启用写缓存的,启用写缓存后我又测试了一下插入速度,大约提升了四倍左右性能,2000条左右每秒,和其它数据库性能差不多。

你可能感兴趣的:(数据库,sql,nosql,mysql,大数据)