InfluxDB是一款开源的时序数据库,由Go语言实现。它的核心是一款定制的存储引擎TSM Tree,对时间序列数据做了优化,优先考虑插入和查询数据的性能。InfluxDB使用类SQL的查询语言InfluxQL,并提供开箱即用的时间序列数学和统计函数。适用于监控、实时分析、物联网、传感器数据等应用场景。是目前最为流行的时间序列数据库。
DolphinDB Database 是一款分析型的分布式时序数据库,内置处理流式数据处理引擎,具有内置的并行和分布式计算的功能,并提供分布式文件系统,支持集群扩展。DolphinDB以C++编写,响应速度极快。提供类似于Python的脚本语言对数据进行操作,支持类标准SQL的语法。提供其它常用编程语言的API,方便与已有应用程序集成。在金融领域中的历史数据分析建模与实时流数据处理,以及物联网领域中的海量传感器数据处理与实时分析等场景中表现出色。
本文将会对DolphinDB和InfluxDB进行性能测试对比。
在本次测试中,硬件配置如下:
设备:DellXPS 8920(07DC)
CPU:Inter® Core™ i7-7700 CPU @ 3.60GHz,4核心8线程
内存:16GB
硬盘:512GB SSD
操作系统:Ubuntu 16.04 x64
由于InfluxDB集群版本闭源,所以本次测试使用的DolphinDB和InfluxDB均为单机版本,并且所有配置项都是默认配置。
1. 数据生成
在本次测试中,我们使用NYSE网站上2016年10月24日纽约交易所的股票交易数据生成了Quotes_Big表。在其中取出一部分数据构成Quotes_Small表。表结构如表1所示。Quotes_Big表中的数据量为78,721,394条,Quotes_Small表中数据量为18,314,172条。数据下载链接及预处理脚本详见附录1。
由于DolphinDB和InfluxDB在存储方式上的差异,我们采用如下设计:我们将Time列指定为InfluxDB中的timestamp;将Exchange和Symbol列指定为InfluxDB中的Tag列(类似于带索引的列);将Bid_Price、Bid_Size、Offer_Price、Offer_Size指定为InfluxDB中的field列(类似于无索引的列)。在DolphinD系统中根据Symbol列在磁盘上进行RANGE分区,分为8个区。
表1.数据类型映射
2. 数据库查询性能测试
我们对11种常用的SQL查询进行了对比测试。Quotes_Small表的测试结果如下表2所示,Quotes_Big表的测试结果如下表3所示。其中,对于DolphinDB的测试,我们使用的是DolphinDB官方的GUI;对于InfluxDB,我们使用的是官方的PythonAPI。执行时间以毫秒为单位,只包含查询本身执行的时间,而不包含结果显示的时间。为了减少特殊值的影响,每个查询都执行10次,表中数据是10次查询的总时间。本次测试的脚本详见附录2。
在几乎所有测试中,DolphinDB的性能都领先InfluxDB多倍,某些情况下的差距甚至超过2个数量级(100倍)。InfluxDB唯一领先DolphinDB的测试是在Quotes_Small表的第4个测试项目,这是由于在数据量较小时DolphinDB并行搜索分区的优势不明显。然而,在数据量较大的情况下,DolphinDB在所有测试中上的性能都优于InfluxDB。DolphinDB可以并行搜索分区的设计使它在过滤性查询方面的性能全面超过了InfluxDB。
表2. Quotes_Small表查询性能测试结果(数据量:18,314,172)
表3. Quotes_Big表查询性能测试结果(数据量:78,721,394)
3. 内置函数计算性能测试
我们测试了8个DolphinDB和InfluxDB都提供的常用内置函数。在所有测试中,DolphinDB的性能都优于InfluxDB 1-2个数量级(10-100倍)。由于DolphinDB对带有滑动窗口的函数极好的优化,在“滑动平均值”(moving_average)的测试中&