| 数据库 | 开源 | 时序 | 集群 |
|---|---|---|---|
| MongoDB | 是 | 否 | 是 |
| TdEngine | 是 | 是 | 是 |
| DolphinDb | 否 | 是 | 免费版限制 |
数据量为2021年1月1日起的1分钟全市场指数合约数据,格式为csv存储,按日期、合约分成单文件。
入库表分成1分钟、3分钟、5分钟、15分钟、30分钟、60分钟、日线表。
入库程序为统一的代码,只在写入(单线程)的时候选择不同的数据库,不影响测试。所有数据库均为单机版,无集群,机器为40核、128G内存,安装在docker中,docker限制核数4核和限制内存8G
测试结果 MongoDb(v5.0.9)插入总时间: 15.92min
总磁盘占用: 1.3G
查询时间测试:
db.bar_01min.find({'code': 'IF000'}).count();
> OK
> 时间: 0.057s
db.bar_05min.find({'code': 'IF000'}).count();
> OK
> 时间: 0.02s
按时间范围查询数据,包含取出数据到内存的时间
# 按合约和周期查询,共28次查询 [MongoAvgUsed]:times[28] avg_per_time[224.048ms] total_time[6273.35ms]
按时间范围选取数据,不过滤code
db.bar_05min.find({'time': {'$lte':1658219000 , '$gte': 1609430000}}).count();
> OK
> 时间: 1.526s
TdEngine(v2.6.0.6)
tdengin采用超级表模式,按分钟分成7个大的超级表,每个合约创建一个子表。
插入总时间: 12min
总磁盘占用: 518M
查询时间测试:
taos> select count(*) from IF000_1m;
count(*) |
========================
89041 |
Query OK, 1 row(s) in set (0.014000s)
taos> select count(*) from IF000_5m;
count(*) |
========================
17809 |
Query OK, 1 row(s) in set (0.012000s)
按单表按时间范围查询数据,包含取出数据到内存的时间,这块tdengin的表现和mongodb差不多,如果不是cpu和内存占用比较低,我都有点怀疑他们是否在吹牛
# 按合约和周期查询,共28次查询 [TaosAvgUsed]:times[28] avg_per_time[247.89ms] total_time[6940.92ms]
按时间范围从超级表中选取数据,不过滤code
taos> select count(*) from bar_5m where ts >= 1609430000000 and ts <= 1658219000000;
count(*) |
========================
1570191 |
Query OK, 1 row(s) in set (0.049000s)
DolphinDb(2.0)
dolphindb采用分布式表模式,按分钟分成7个表,依旧使用c++程序单线程入库,注意时间戳需要自己转换时区(+8),否则查询出来的时间会错乱(槽点),c++摸索起来比较乱(槽点)。
插入总时间: 22min (问号脸)
总磁盘占用: 544M
CPU占用: 超过50%
查询时间测试:
> timer select count(*) from loadTable("dfs://futures_min", `bar_1m) where code = 'IF000'
Time elapsed: 145.646 ms
> timer select * from loadTable("dfs://futures_min", `bar_1m) where code = 'IF000'
Time elapsed: 699.525 ms
> timer select count(*) from loadTable("dfs://futures_min", `bar_5m) where code = 'IF000'
Time elapsed: 54.573 ms
> timer select * from loadTable("dfs://futures_min", `bar_5m) where code = 'IF000'
Time elapsed: 418.723 ms
按时间范围从超级表中选取数据,不过滤code
> timer select count(*) from loadTable("dfs://futures_min", `bar_5m) where time >= timestamp(1609430000000) and time <= timestamp(1658219000000);
Time elapsed: 133.771 ms
按单表按时间范围查询数据,包含取出数据到内存的时间就不测试了,c++接口取数据不太好用,解析太费事,python装不上,限制python版本(懒得弄了,被c++接口编译还折腾了半天,cmakelists都懒得写的团队)
性能比较插入性能
| 数据库 | 时间 | 空间 | cpu | 内存 |
|---|---|---|---|---|
| MongoDB | 15.92min | 1.3G | 30%-50% | 1.2G |
| TdEngine | 12min | 518M | 12%左右 | 300M |
| DolphinDb | 22min | 544M | 30%-100% | 1G |
查询性能
select *查询不是很准确,仅供参考,各个平台提供的查询基准不一致。
| 数据库 | 1m count(*) | 1m select * | 5mcount(*) | 5m select * | 范围查询 |
|---|---|---|---|---|---|
| MongoDB | 57ms | 1.554s | 20ms | 323ms | 1.526s |
| TdEngine | 14ms | 880ms | 12ms | 623ms | 49ms |
| DolphinDb | 145ms | 699ms | 54ms | 418ms | 133ms |
c++程序单线程测试,读取不同周期数据28次结果,按时间范围选取,不同合约测试
| 数据库 | 平均时间 | 总时间 |
|---|---|---|
| MongoDB | 224.048ms | 6273.35ms |
| TdEngine | 247.89ms | 6940.92ms |
| DolphinDb |
个人评测,有些不足地方请指正。



