InfluxDB与关系型数据库的比较

如果你学过mysql,那么肯定想比较一下mysql和InfluxDb的区别,是的,人总喜欢比较。比如说谁家的女朋友漂不漂亮,谁家的老公又挣了几百万。


关系型数据库与InfluxDB之间的区别

该章向使用过关系型数据库的用户介绍了InfluxDB与SQL数据库之间的区别。

本文的SQL数据库指的关系型数据库,如Mysql、Oracle等。如果要复习一下,可以点击这里

InfluxDB是一个时间序列数据库,主要存储的是以时间为序存储的数据。其实,SQL数据库是可以提供时序的功能,只要将时间作为主键,就能够将SQL数据库当作时序数据库来处理。简而言之,InfluxDB用于存储大量的时间序列数据,并对这些数据进行快速的实时分析。而SQL数据库虽然可以有时序的功能,但是效率并不高。


时序数据库中时间戳(timestamp)是必须要有的

在InfluxDB中,时间戳(timestamp)标识了在任何给定数据中的单个点。如果你学习过MySQL数据库表,你可以理解为,有一个表其中主键是由系统预先设置的,主键永远是时间戳。

InfluxDB的模式schema是可以随时改变的。在InfluxDB中,您不需要事先定义schema。可以任何时候,插入不同的数据。但是必须要有时间,MySQL就不行,你需要事项定义模式,而且不是随时可以改变的。


SQL数据库和InfluxDb数据库对比举例

为了比较SQL数据库和InfluxDb数据库的区别,我们先举一个SQL数据库的例子。

这个表的表名是foodships,这个表park_id,planettime列都有索引,#_foodships列没有索引。

这个表的大致意思是,在某个星球上的某个时刻,有几艘食品运输船。

park_id planet time #_foodships
1 Earth 1429185600000000000 0
1 Earth 1429185601000000000 3
1 Earth 1429185602000000000 15
1 Earth 1429185603000000000 15
2 Saturn 1429185600000000000 5
2 Saturn 1429185601000000000 9
2 Saturn 1429185602000000000 10
2 Saturn 1429185603000000000 14
3 Jupiter 1429185600000000000 20
3 Jupiter 1429185601000000000 21
3 Jupiter 1429185602000000000 21
3 Jupiter 1429185603000000000 20
4 Saturn 1429185600000000000 5
4 Saturn 1429185601000000000 5
4 Saturn 1429185602000000000 6
4 Saturn 1429185603000000000 5

这些数据在InfluxDB看起来就像这样:

name: foodships
tags: park_id=1, planet=Earth
time			               #_foodships
----			               ------------
2015-04-16T12:00:00Z	 0
2015-04-16T12:00:01Z	 3
2015-04-16T12:00:02Z	 15
2015-04-16T12:00:03Z	 15

name: foodships
tags: park_id=2, planet=Saturn
time			               #_foodships
----			               ------------
2015-04-16T12:00:00Z	 5
2015-04-16T12:00:01Z	 9
2015-04-16T12:00:02Z	 10
2015-04-16T12:00:03Z	 14

name: foodships
tags: park_id=3, planet=Jupiter
time			               #_foodships
----			               ------------
2015-04-16T12:00:00Z	 20
2015-04-16T12:00:01Z	 21
2015-04-16T12:00:02Z	 21
2015-04-16T12:00:03Z	 20

name: foodships
tags: park_id=4, planet=Saturn
time			               #_foodships
----			               ------------
2015-04-16T12:00:00Z	 5
2015-04-16T12:00:01Z	 5
2015-04-16T12:00:02Z	 6
2015-04-16T12:00:03Z	 5

参考上面的数据,一般可以这么说:

  • InfluxDB的measurement(foodships)和SQL数据库里的table类似;
  • InfluxDB的tag(park_idplanet)类似于SQL数据库里有索引的列;有索引代表查询速度快。
  • InfluxDB中的field(#_foodships)类似于SQL数据库里没有索引的列;
  • InfluxDB里面的数据点(例如2015-04-16T12:00:00Z 5)类似于SQL数据库的行;

continuous query和retention policy与SQL数据库中的存储过程类似

基于这些数据库术语的比较,InfluxDB的continuous query和retention policy与SQL数据库中的存储过程类似。它们被指定一次,然后定期自动执行。

当然,SQL数据库和InfluxDB之间存在一些重大差异。SQL中的JOIN不适用于InfluxDB中的measurement。而且,正如我们上面提到的那样,一个measurement就像一个SQL的table,其中主索引总是被预设为时间,每一行的时间戳是可以重复的。InfluxDB的时间戳记必须是 UNIX epoch(GMT)或格式化为日期时间RFC3339格式的字符串才有效。

UNIX epoch其实就是时间戳的意思。

查看更多关于InfluxDB的术语的详细解释,请参考专业术语


InfluxQL和SQL

InfluxQL是InfluxDb的查询语言,其语法和SQL语言很相似。如果你学习过SQL,那么InfluxQL这种语法非常容易上手。

InfluxQL的select语句来自于SQL中的select形式:

SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>
  • stuff 为需要查询的数据。*号表示查询所有属性。

where是可选的,举个例子:

SELECT * FROM "foodships"

如果你仅仅想看planet为Saturn的数据:

SELECT * FROM "foodships" WHERE "planet" = 'Saturn'

如果你想看到planet为Saturn,并且在UTC时间为2015年4月16号12:00:01之后的数据:

SELECT * FROM "foodships" WHERE "planet" = 'Saturn' AND time > '2015-04-16 12:00:01'

如上例所示,InfluxQL允许您在WHERE子句中指定查询的时间范围。您可以使用包含单引号的日期时间字符串,格式为YYYY-MM-DD HH:MM:SS.mmm(mmm为毫秒,为可选项,您还可以指定微秒或纳秒。您还可以使用相对时间与now()来指代服务器的当前时间戳:

SELECT * FROM "foodships" WHERE time > now() - 1h

该查询输出measurement为foodships中的数据,其中时间戳比服务器当前时间减1小时。与now()做计算来决定时间范围的可选单位有:

字母 意思
u或µ 微秒
ms 毫秒
s
m 分钟
h 小时
d
w 星期

InfluxQL还支持正则表达式,表达式中的运算符,SHOW语句和GROUP BY语句。有关这些主题的深入讨论,请参阅我们的数据探索页面。 InfluxQL功能还包括COUNTMINMAXMEDIANDERIVATIVE等。 有关完整列表,请查看函数页面。


为什么InfluxDB中的数据不会经常更改?

InfluxDB是针对时间序列数据进行了优化的数据库。这些数据通常来自工业互联网中的传感器,plc等工控设备,或来自大型网站的点击数据或金融交易列表数据等。

这个数据有一个共同之处在于它只看一个点没什么用,必须看一段时间的数据才有用。一个读者说,在星期二UTC时间为12:38:35时根据他的电脑CPU利用率为12%,这个很难得出什么结论。只有跟其他的series结合并可视化时,它变得更加有用。随着时间的推移开始显现的趋势,是我们从这些数据里真正想要看到的。另外,时间序列数据通常是一次写入,很少更新。

结果是,由于优先考虑create和read数据的性能而不是update和delete,InfluxDB不是一个完整的CRUD数据库,更像是一个CR-ud。

update,delete语句执行会很慢。