比较 InfluxDB 与 SQL 数据库

本页记录了 InfluxDB OSS 的早期版本。InfluxDB OSS v2是最新稳定版本。

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

时机就是一切

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

InfluxDB 还认识到您的架构偏好可能会随时间而变化。在 InfluxDB 中,您不必预先定义架构。数据点可以包含测量上的一个字段、测量上的所有字段或介于两者之间的任意数字。您只需为该新字段写入一个点,即可将新字段添加到测量中。如果您需要对术语"测量"、"标签"和"字段"的解释,请查看下一节,了解 SQL 数据库到 InfluxDB 术语对照表。

术语

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

chroma 复制代码
+---------+---------+---------------------+--------------+
| 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 中如下所示:

chroma 复制代码
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 之间存在一些重大差异。SQLJOIN不适用于 InfluxDB 测量;您的架构设计应该反映出这种差异。而且,正如我们上面提到的,测量就像一个 SQL 表,其中主索引始终预设为时间。InfluxDB 时间戳必须采用 UNIX 纪元 (GMT) 或格式化为在 RFC3339 下有效的日期时间字符串。

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

查询语言

InfluxDB支持多种查询语言:

通量

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

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

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

InfluxQL

InfluxQL 是一种与 InfluxDB 交互的类 SQL 查询语言。它经过精心设计,让来自其他 SQL 或类 SQL 环境的用户感到熟悉,同时还提供特定于存储和分析时间序列数据的功能。然而,InfluxQL 不是 SQL ,缺乏对更高级操作(如)的支持UNIONJOIN而SQL 高级用户已经习惯了这些操作。此功能可通过FluxHAVING获得。

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

chroma 复制代码
SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>

其中WHERE是可选的。

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

chroma 复制代码
SELECT * FROM "foodships"

如果你只想查看行星的数据Saturn,你可以输入:

chroma 复制代码
SELECT * FROM "foodships" WHERE "planet" = 'Saturn'

如果要查看Saturn2015 年 4 月 16 日 12:00:01 UTC 之后的行星数据,请输入:

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

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

chroma 复制代码
SELECT * FROM "foodships" WHERE time > now() - 1h

foodships该查询输出度量中时间戳比服务器当前时间减一小时新的数据。指定时间持续时间的选项now()包括:

意义
纳秒 纳秒
u 或 µ 微秒
多发性硬化症 毫秒
s
分钟
时长 小时
d

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

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

InfluxDB 不是 CRUD

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

这些数据有一个共同点,那就是总体上更有用。如果某个读数显示,你的计算机的 CPU 在周二 UTC 时间 12:38:35 的利用率为 12%,那么很难得出结论。如果将其与该系列的其他数据结合起来并进行可视化,就会变得更加有用。这就是随时间变化的趋势开始显现的地方,并且可以从数据中得出可操作的见解。此外,时间序列数据通常只写入一次,很少更新。

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

  • 要更新某个点,请插入具有相同测量值、标签集和时间戳的点
  • 您可以删除一系列数据,但不能根据字段值删除单个数据点。解决方法是,您可以搜索字段值,检索时间,然后根据time字段删除数据。
  • 您目前无法更新或重命名标签 - 请参阅 GitHub 问题#4157了解更多信息。要修改一系列点的标签,请找到具有有问题的标签值的点,将值更改为所需的值,将点写回,然后删除具有旧标签值的系列。
  • 您不能通过标签键(而不是值)删除标签 - 请参阅 GitHub 问题#8604
相关推荐
小蜗牛慢慢爬行17 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger21 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud42 分钟前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡1 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷1 小时前
Redis
数据库·redis·缓存
仰望大佬0071 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名2 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪2 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb
呼啦啦啦啦啦啦啦啦3 小时前
【MySQL篇】事务的认识以及四大特性
数据库·mysql