文档文档

Compare InfluxDB to SQL databases

此页面记录了早期版本的 InfluxDB OSS。InfluxDB OSS v2 是最新的稳定版本。请参阅 InfluxDB v2 文档

InfluxDB 类似于 SQL 数据库,但在许多方面有所不同。 InfluxDB 专为时间序列数据而构建。关系数据库可以处理时间序列数据,但未针对常见的时间序列工作负载进行优化。 InfluxDB 旨在存储大量时间序列数据,并快速对该数据执行实时分析。

时序至关重要

在 InfluxDB 中,时间戳标识给定数据系列中的单个点。这就像 SQL 数据库表,其中主键由系统预设,并且始终是时间。

InfluxDB 还认识到您的 schema 偏好可能会随时间而变化。在 InfluxDB 中,您不必预先定义模式。数据点可以具有 measurement 上的一个字段、measurement 上的所有字段或介于两者之间的任意数量的字段。您只需为新字段写入一个点,即可向 measurement 添加新字段。如果您需要 measurement、tag 和 field 这些术语的解释,请查看下一节,了解从 SQL 数据库到 InfluxDB 术语的对照表。

术语

下表是一个(非常)简单的示例,说明 SQL 数据库中名为 foodships 的表,其中包含未索引的列 #_foodships 和索引列 park_idplanettime

+---------+---------+---------------------+--------------+
| 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 数据库表。
  • InfluxDB tag (park_idplanet) 类似于 SQL 数据库中的索引列。
  • InfluxDB field (#_foodships) 类似于 SQL 数据库中的非索引列。
  • InfluxDB point(例如,2015-04-16T12:00:00Z 5)类似于 SQL 行。

基于数据库术语的这种比较,InfluxDB 连续查询保留策略 类似于 SQL 数据库中的存储过程。它们被指定一次,然后定期自动执行。

当然,SQL 数据库和 InfluxDB 之间存在一些主要差异。 SQL JOIN 不适用于 InfluxDB measurement;您的 schema 设计应反映这种差异。而且,正如我们上面提到的,measurement 就像一个 SQL 表,其中主索引始终预设为时间。 InfluxDB 时间戳必须采用 UNIX epoch (GMT) 格式或格式化为 RFC3339 下有效的日期时间字符串。

有关本节中提到的 InfluxDB 术语的更详细描述,请参阅我们的 术语表

查询语言

InfluxDB 支持多种查询语言

Flux

Flux 是一种数据脚本语言,旨在用于查询、分析和处理时间序列数据。从 InfluxDB 1.8.0 开始,Flux 可与 InfluxQL 一起用于生产环境。

对于那些熟悉 InfluxQL 的人来说,Flux 旨在解决自推出 InfluxDB 1.0 以来我们收到的许多未解决的功能请求。有关 Flux 和 InfluxQL 之间的比较,请参阅 Flux 与 InfluxQL 的比较

Flux 是在 InfluxDB OSS 2.0InfluxDB Cloud(一种在多个云服务提供商上普遍可用的平台即服务 (PaaS))中使用数据的主要语言。将 Flux 与 InfluxDB 1.8+ 一起使用,您可以熟悉 Flux 的概念和语法,并轻松过渡到 InfluxDB 2.0。

InfluxQL

InfluxQL 是一种类似于 SQL 的查询语言,用于与 InfluxDB 交互。它的设计旨在让来自其他 SQL 或类 SQL 环境的人感到熟悉,同时还提供特定于存储和分析时间序列数据的功能。但是,InfluxQL 不是 SQL,并且缺乏对 SQL 高级用户习惯的更高级操作(如 UNIONJOINHAVING)的支持。此功能可通过 Flux 获得。

InfluxQL 的 SELECT 语句遵循 SQL SELECT 语句的形式

SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>

其中 WHERE 是可选的。

要获取上面部分中的 InfluxDB 输出,您需要输入

SELECT * FROM "foodships"

如果您只想查看行星 Saturn 的数据,则需要输入

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

如果您想查看 2015 年 4 月 16 日 12:00:01 UTC 之后行星 Saturn 的数据,则需要输入

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

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

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

该查询输出 foodships measurement 中的数据,其中时间戳比服务器当前时间减去一小时更新。使用 now() 指定时间持续时间的选项有

字母含义
ns纳秒
u 或 µ微秒
ms毫秒
s
m分钟
h小时
d
w

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

现在您已经了解了大致思路,请查看我们的 入门指南

InfluxDB 不是 CRUD

InfluxDB 是一个针对时间序列数据进行优化的数据库。此数据通常来自分布式传感器组、大型网站的点击数据或金融交易列表等来源。

这些数据的一个共同点是,它们在聚合中更有用。一个读数说您的计算机的 CPU 在星期二 UTC 时间 12:38:35 的利用率为 12%,很难从中得出结论。当它与系列的其余部分结合并可视化时,它变得更有用。这就是随着时间的推移开始显示趋势,并且可以从数据中得出可操作的见解的地方。此外,时间序列数据通常只写入一次,很少更新。

结果是,InfluxDB 不是一个完整的 CRUD 数据库,而更像是一个 CR-ud,它优先考虑创建和读取数据的性能而不是更新和销毁,并且 防止某些更新和销毁行为,以使创建和读取更高效

  • 要更新一个点,请插入一个具有 相同的 measurement、tag 集合和时间戳 的点。
  • 您可以 删除或删除一个 series,但不能根据字段值删除单个点。作为一种解决方法,您可以搜索字段值,检索时间,然后 基于 time 字段进行 DELETE
  • 您还不能更新或重命名 tag - 有关更多信息,请参阅 GitHub 问题 #4157。要修改一系列点的 tag,请找到具有违规 tag 值的点,将值更改为所需的值,将点写回,然后删除具有旧 tag 值的 series。
  • 您不能按 tag 键(而不是值)删除 tag - 请参阅 GitHub 问题 #8604

此页面是否对您有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续像现在这样使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源现已进入公开 Alpha 阶段

InfluxDB 3 开源现在可用于 alpha 测试,根据 MIT 或 Apache 2 许可获得许可。

我们正在发布两个产品作为 alpha 版本的一部分。

InfluxDB 3 Core 是我们的新开源产品。它是一个用于时间序列和事件数据的最新数据引擎。 InfluxDB 3 Enterprise 是一个商业版本,它建立在 Core 的基础上,增加了历史查询功能、读取副本、高可用性、可扩展性和细粒度的安全性。

有关如何入门的更多信息,请查看