InfluxDB 的 InfluxQL 与 SQL

导航至

InfluxDB 是一个专为处理高写入吞吐量和大量时间戳数据而构建的时间序列数据库。从监控系统指标到跟踪物联网设备读数和分析金融趋势,它在时间是基本因素的场景中表现出色。随着 InfluxDB v3 的发布,用户现在可以受益于双查询语言支持:SQL 和 InfluxQL。SQL 由 Apache DataFusion 实现提供支持,引入了熟悉的、广泛使用的语言的灵活性,实现了与现有分析工作流程的无缝集成。另一方面,InfluxQL 是一种专为时间序列数据量身定制的领域特定查询语言,为基于时间的聚合和窗口操作提供了优化的语法。作为 InfluxDB 1.x 的原生查询语言,InfluxQL 对于从早期版本迁移到 v3 的用户来说是自然的选择,使他们能够无缝迁移其现有查询。

这篇博文将向您展示可用于迁移查询的工具,并帮助您决定选择哪种查询语言。虽然 InfluxQL 仍然是一个强大的选项,但由于其增加的功能支持、更广泛的采用以及与其他工具的增强互操作性,SQL 已成为 InfluxDB v3 的主要选择。这种双语言方法允许用户根据其特定需求选择最佳工具,无论是利用高级 SQL 功能还是利用 InfluxQL 的专用时间序列结构。这篇博客探讨了 SQL 和 InfluxQL 之间的区别、它们的优势以及每种语言擅长的场景。

要跟随本文中的示例进行操作,请使用NOAA 的空气传感器数据集。您可以轻松地将行协议数据通过 UI 写入 InfluxDB v3 Cloud(加载数据 > 存储桶 > + 添加数据 > 行协议 > 选择您要写入的存储桶 > 加载文件或复制并粘贴行协议)。

一些术语差异

在探讨每种语言的优点和缺点之前,必须了解它们之间关键的术语差异。在 SQL 中,数据库、表和列的概念是核心。数据库是一个组织表的容器,每个表都包含结构化数据的行和列。列表示数据的特定属性或特性,例如名称、日期或值。

在 InfluxQL 中,这些概念表示为存储桶、测量、字段和标签。存储桶相当于数据库,是时间序列数据的逻辑容器。测量类似于表,并将相关数据点(如传感器读数或指标)分组。字段表示实际数据值,如温度或压力,而标签是键值对,提供用于过滤和组织数据的元数据,如位置或设备类型。虽然术语不同,但底层概念仍然是类似的:数据库对应于存储桶,表对应于测量,列对应于字段和标签。

因此,总结一下

数据库 <-> 存储桶
表 <-> 测量
列 <-> 字段和标签

字段和标签在 InfluxDB v3 中转换为列,有效地消除了它们之间的任何功能差异。在早期版本(如 InfluxDB 1.x)中,用户需要仔细决定要索引哪些值,因为索引标签可能会因基数问题而影响性能。使用 InfluxDB v3,这些问题不再是问题,因为该架构经过优化,可以高效地处理高基数。

基本语法差异

InfluxQL 和 SQL 非常相似。例如,您可以使用以下命令从表中选择所有数据

#SQL or InfluxQL
SELECT * FROM "airSensors"

但是,这两种语言之间存在一些明显的语法差异。InfluxDB v3 中的 SQL 与您可能熟悉的 SQL 之间也存在一些语法差异。这是因为 InfluxDB v3 中的 SQL 使用 Apache DataFusion 的 SQL 实现,该实现具有特定的语法要求。例如,您必须在查询中显式定义 Arrow 数据类型。换句话说,如果您想查询过去五分钟内的所有空气传感器数据,则必须在 SQL 中指定间隔类型

#SQL 
SELECT * FROM "airSensors" WHERE time >= now() - interval '5 minutes'

相比之下,在 InfluxQL 中,您不必指定间隔类型。另请注意 SQL 和 InfluxQL 的持续时间文字的差异

#InfluxQL 
SELECT * FROM "airSensors" WHERE time >= now() - 5m

同样,如果您想从特定时间戳查询,则必须使用 SQL 指定数据类型,但 InfluxQL 则不必。另请注意 SQL 的日期时间格式(ISO 8601 格式)与 InfluxQL 的日期时间格式之间的差异

#SQLSELECT * FROM "airSensors" time >= ('2023-12-01 18:35:30.000')::TIMESTAMP
#InfluxQL 
SELECT * FROM "airSensors" time > '2024-12-01T18:35:30Z

这两种语言之间另一个重要的语法差异出现在您如何随时间应用聚合或选择器函数中。假设您想查找传感器 TLM0100 在过去一小时内的平均气温,并按 5 分钟间隔分组(来自空气传感器数据集)。如果您的需求不涉及复杂的分析、复杂的子查询或连接,InfluxQL 也可以是一个不错的选择。其简单的语法通常使其更易于用于更简单的查询。例如,以下是如何使用 InfluxQL 计算 5 分钟时间窗口内的平均气温

#InfluxQL 
SELECT MEAN("temperature") FROM "airSensors" WHERE "sensor" = 'TLM0100' AND time > now() - 1h GROUP BY time(5m)

相比之下,在 SQL 中等效的函数将需要 date_bin() 函数。它还要求您显式定义 Arrow 数据类型

#SQL SELECT "sensor_id", 
DATE_BIN(INTERVAL '5 minute', time, TIMESTAMP '2022-01-01 00:00:00Z') AS _time,
avg("temperature")  as average_temp
FROM "airSensors"
WHERE  time >= now() - interval '1 hour' AND "sensor" = 'TLM0100'

用户体验和查询工具

InfluxQL 和 SQL 之间最显著的区别之一是每种语言的用户体验和可用工具。在 InfluxDB v3 中,您可以使用多种工具以 InfluxQL 或 SQL 查询数据,包括

  • InfluxDB v3 Python CLI:此 CLI 扩展是 InfluxDB v3 Python 客户端库的扩展,允许用户交互式地查询和写入数据。此外,它还具有与 OpenAI 的 ChatGPT 的(Alpha)集成,用于使用自然语言查询数据。此功能需要 OpenAI API 密钥,并且可以通过 chatgpt 命令访问。希望此功能将使 InfluxQL 和 SQL 中的查询变得更加容易。
  • HTTP API:HTTP API 非常适合喜欢轻量级、语言无关解决方案的用户,或者当所选语言没有客户端库可用时。它提供了对 InfluxDB 查询和管理数据功能的直接访问。
  • 客户端库:这些库支持多种编程语言,包括 C#、Go、Java、Python 和 JavaScript。它们非常适合构建自定义应用程序或集成的开发人员,并提供了一种与 InfluxDB API 交互的结构化方式。
  • Arrow Flight + RPC 客户端:Flight RPC 客户端可以使用 SQL 或 InfluxQL 查询数据,利用特定于 InfluxDB v3 的 Flight RPC 协议。单个 DoGet() 请求支持身份验证、查询和数据检索,使其对于高性能用例非常有效。
  • Flight SQL 客户端:这些客户端使用 Flight SQL 协议仅使用 SQL 查询 InfluxDB Cloud Dedicated 数据库。虽然它们不支持 InfluxQL,但它们的设计优化了基于 SQL 的工作流程的性能和互操作性。
  • InfluxDB Cloud v3 UI:InfluxDB Cloud v3 还提供了在 UI 中使用 SQL 查询的功能。您无法使用 UI 通过 InfluxQL 进行查询

InfluxDB v3 Cloud UI 中的数据浏览器还提供 SQL 同步功能,可帮助您编写 SQL 查询。

BI 和可视化工具支持

某些可视化工具仅支持特定的查询语言,这可能会影响您的选择。例如,SQL 与以下工具兼容

相比之下,InfluxQL 与以下工具兼容

如果您的工作流程依赖于特定的可视化工具,请考虑选择一种最符合其要求的查询语言。

InfluxQL 相对于 SQL 的优势

InfluxQL 相对于 SQL 的主要优势在于,它适用于任何希望将其查询迁移到 InfluxDB v3 的 1.x 用户。顺便说一句,如果您是 1.x 用户并且有连续查询,则必须将 InfluxQL 连续查询迁移到 Flux 任务,或利用 Python 客户端库并使用您选择的处理引擎。例如,您可以利用 Quix Streams

InfluxQL 的另一个优势在于模式探索。虽然 SQL 具有一些可用的模式探索功能,但它们提供的功能非常有限。

使用 InfluxQL 进行模式探索 使用 SQL 进行模式探索
- 列出存储桶中的测量
- 列出包含特定标签键值对的测量
- 列出与正则表达式匹配的测量
- 列出测量中的字段键
- 列出测量中的标签键
- 列出包含特定标签键值对的测量中的标签键
- 列出特定标签键的标签值
- 列出多个标签的标签值
- 列出与正则表达式匹配的标签的标签值
- 列出与特定标签键值对关联的标签值
- 列出存储桶中的测量
- 列出测量中的列

如果您有意使用标签和字段来增强摄取后数据的组织性,那么 InfluxQL 是模式探索的绝佳选择。

SQL 相对于 InfluxQL 的优势

虽然某些查询在 InfluxQL 中语法更简单,但 SQL 提供了更多的功能。您可以查看一些差异。

InfluxQL SQL
16聚合函数选择器函数 41聚合函数,包括通用函数、统计函数、近似函数
26转换函数 39数学函数
3日期和时间函数 22时间和日期函数

SQL 还具有以下 InfluxQL 没有的功能

  • 窗口函数
  • 字符串函数
  • 连接 (JOINS)
  • 联合 (UNIONS)
  • 数组函数
  • May 函数 (此处 "May" 可能是笔误,应为 Math 函数或类似函数,但保持原文翻译)
  • 哈希函数
  • 还有更多功能(要查看可用功能的完整列表,请参阅Apache DataFusion SQL 参考)。

这些功能使您可以在 SQL 中执行更复杂的分析。例如,您可以使用以下命令查找空气传感器数据中每秒温度和一氧化碳的导数或变化率

#SQL SELECT time, (co_delta_v / delta_t_ns) * 1000000000 as co_rate, (temperature_delta_v / delta_t_ns) * 1000000000 as temperature_rate FROM
(SELECT (lag(co, 1) OVER (ORDER BY time))  - co  as co_delta_v,
  	      (lag(temperature, 1) OVER (ORDER BY time))  - temperature  as temperature_delta_v,
             (lag(cast(time as bigint), 1) OVER (ORDER BY time)) - cast (time as bigint) as delta_t_ns,
                time
FROM airSensors WHERE sensor_id='TML0100' AND time >= now() - interval '1 hour' )

使用子查询,它计算 co (co_delta_v) 和 temperature (temperature_delta_v) 的连续行之间的差异,以及纳秒级的时间差 (delta_t_ns)。这些差异是使用 lag() 函数以及按时间排序的窗口计算的。外部查询然后将值差异除以时间差,并通过乘以 1,000,000,000 将其缩放到秒,从而得到 co_ratetemperature_rate。该查询过滤数据集,以仅包含传感器 TML0100 且在指定时间范围内的行,精确分析这些指标随时间变化的速度。这对于实时监控环境或运营趋势特别有用。

其他资源

如果您喜欢这篇博文,您可能会发现以下资源在您开始 InfluxQL 或 SQL 和 InfluxDB v3 之旅时很有价值

总结

希望这篇博文能帮助您理解 InfluxDB v3 中 InfluxQL 和 SQL 之间的区别。与往常一样,请从InfluxDB v3 Cloud 这里开始使用。在下一篇文章中,我们将介绍如何运行该项目,深入探讨其架构和逻辑,并讨论所选技术栈的一些优点和缺点。如果您需要帮助,请在我们的社区网站Slack 频道上联系我们。如果您也在使用 InfluxDB 进行数据处理项目,我很乐意与您交流!