Documentation

将InfluxDB与SQL数据库进行比较

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

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

时机就是一切

在InfluxDB中,时间戳标识任何给定数据系列中的一个单一点。这类似于SQL数据库表,其中主键由系统预设,并始终为时间。

InfluxDB 还认识到你的 schema 偏好可能会随着时间而变化。 在 InfluxDB 中,你不必提前定义 schema。 数据点可以具有某个测量的一个字段、测量的所有字段或介于两者之间的任何数量。 你可以通过为该新字段写入一个点来向测量添加新字段。 如果你需要对测量、标签和字段的术语进行解释,请查看下一节关于 SQL 数据库与 InfluxDB 术语对照的内容。

术语

下面的表是一个简单的表,称为 foodships,位于SQL数据库中,包含未索引的列 #_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

根据上述示例,总的来说:

  • An InfluxDB measurement (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纪元(GMT)或格式化为符合RFC3339的日期时间字符串。

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

查询语言

InfluxDB支持多种查询语言:

通量

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

对于熟悉InfluxQL的人来说,Flux旨在解决自从引入InfluxDB 1.0以来我们收到的许多未解决的功能请求。欲了解Flux和InfluxQL之间的比较,请参见Flux vs 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日UTC时间12:00:01之后的行星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度量中时间戳晚于服务器当前时间减去一小时的数据。 使用now()指定时间持续时间的选项是:

字母含义
纳秒纳秒
u 或 µ微秒
毫秒毫秒
s
m分钟
小时小时
d天数
w

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

现在你已经有了大致的想法,查看我们的 入门指南

InfluxDB 不是 CRUD

InfluxDB 是一个为时间序列数据优化的数据库。 这些数据通常来自分布式传感器组、大型网站的点击数据或金融交易列表。

这些数据的一个共同点是,它们在总体上更有用。 单单查看您计算机的CPU在UTC时间星期二12:38:35的利用率为12%很难得出结论。 当与其他系列结合并进行可视化时,它变得更有用。 在这里,随着时间的推移,趋势开始显现,可以从数据中得出可行的见解。 此外,时间序列数据通常一次写入,少有更新。

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

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


Flux的未来

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

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

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

有关如何开始的更多信息,请查看: