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_id
、planet
和 time
。
+---------+---------+---------------------+--------------+
| 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_id
和planet
) 类似于 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.0 和 InfluxDB Cloud(一种在多个云服务提供商上普遍可用的平台即服务 (PaaS))中使用数据的主要语言。将 Flux 与 InfluxDB 1.8+ 一起使用,您可以熟悉 Flux 的概念和语法,并轻松过渡到 InfluxDB 2.0。
InfluxQL
InfluxQL 是一种类似于 SQL 的查询语言,用于与 InfluxDB 交互。它的设计旨在让来自其他 SQL 或类 SQL 环境的人感到熟悉,同时还提供特定于存储和分析时间序列数据的功能。但是,InfluxQL 不是 SQL,并且缺乏对 SQL 高级用户习惯的更高级操作(如 UNION
、JOIN
和 HAVING
)的支持。此功能可通过 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.mmm
(mmm
是毫秒,是可选的,您还可以指定微秒或纳秒)。您还可以使用相对时间 now()
,它指的是服务器的当前时间戳
SELECT * FROM "foodships" WHERE time > now() - 1h
该查询输出 foodships
measurement 中的数据,其中时间戳比服务器当前时间减去一小时更新。使用 now()
指定时间持续时间的选项有
字母 | 含义 |
---|---|
ns | 纳秒 |
u 或 µ | 微秒 |
ms | 毫秒 |
s | 秒 |
m | 分钟 |
h | 小时 |
d | 天 |
w | 周 |
InfluxQL 还支持正则表达式、表达式中的算术运算、SHOW
语句和 GROUP BY
语句。有关这些主题的深入讨论,请参阅我们的 数据探索 页面。 InfluxQL 函数包括 COUNT
、MIN
、MAX
、MEDIAN
、DERIVATIVE
等。有关完整列表,请查看 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。
此页面是否对您有帮助?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一份子!我们欢迎并鼓励您对 InfluxDB 和本文档提供反馈和错误报告。要获得支持,请使用以下资源
拥有年度合同或支持合同的客户 可以 联系 InfluxData 支持。