比较 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
相关推荐
小周不摆烂1 小时前
Java基础-JDBC
java·数据库·oracle
是桃萌萌鸭~2 小时前
导出 MySQL 中所有表的结构(包括外键约束),并在另一个地方创建相同的表
数据库·mysql
Fisher36522 小时前
SQL 常用更新操作
数据库·sql
阿葱(聪)2 小时前
java.lang.NoClassDefFoundError: kotlin/jvm/JvmInline
数据库·oracle
KELLENSHAW2 小时前
MySQL45讲 第十六讲 “order by”是怎么工作的?
数据库·mysql
hummhumm2 小时前
Oracle 第20章:数据库调优
java·数据库·后端·python·mysql·oracle·database
JingHongB3 小时前
Redis的常用数据类型以及命令
数据库·redis·缓存
ffyyhh9955113 小时前
SpringBoot事务管理:自调用与事务回滚行为分析
数据库
小光学长3 小时前
基于vue框架的的楼盘销售管理系统6n60a(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
数据库
Francek Chen3 小时前
【大数据技术基础 | 实验八】HBase实验:新建HBase表
大数据·数据库·hadoop·分布式·zookeeper·hbase