最近公司准备把内存数据库和数据库换成国产的数蚕数据库。老大让我来测试一下性能。周末正好加个小班小试了一下。
环境准备:
官方提供的包括的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条左右每秒,和其它数据库性能差不多。