文档文档

比较 InfluxDB 与 SQL 数据库

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

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

时间至关重要

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

InfluxDB 还认识到您的模式偏好可能会随时间而变化。在 InfluxDB 中,您不必预先定义模式。数据点可以具有度量中的一个字段、度量中的所有字段或介于两者之间的任何数量。您只需为新字段写入一个点,即可向度量添加新字段。如果您需要解释术语度量、标签和字段,请查看下一节,了解从 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 度量 (foodships) 类似于 SQL 数据库表。
  • InfluxDB 标签 (park_idplanet) 类似于 SQL 数据库中的索引列。
  • InfluxDB 字段 (#_foodships) 类似于 SQL 数据库中的未索引列。
  • InfluxDB 点(例如,2015-04-16T12:00:00Z 5)类似于 SQL 行。

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

当然,SQL 数据库和 InfluxDB 之间存在一些主要差异。 SQL JOIN 不适用于 InfluxDB 度量;您的模式设计应反映这种差异。而且,正如我们在上面提到的,度量就像 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,并且缺乏对更高级操作(如 UNIONJOINHAVING)的支持,而 SQL 高级用户已经习惯了这些操作。此功能可通过 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'

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

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 度量中的数据,其中时间戳比服务器的当前时间减去一小时更新。使用 now() 指定时间持续时间的选项有

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

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

现在您已经了解了基本概念,请查看我们的入门指南

InfluxDB 不是 CRUD

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

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

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

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

此页面对您有帮助吗?

感谢您的反馈!


Flux 的未来

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

阅读更多

现已全面上市

InfluxDB 3 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一个开源、高速、最新的数据引擎,可以实时收集和处理数据,并将其持久化到本地磁盘或对象存储。 InfluxDB 3 Enterprise 以 Core 的基础为构建,增加了高可用性、读取副本、增强的安全性以及数据压缩,从而实现更快的查询和优化的存储。 InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

有关更多信息,请查看