将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_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
根据上述示例,总的来说:
- An InfluxDB measurement (
foodships) 类似于 SQL 数据库表。 - InfluxDB 标签 (
park_id和planet) 像是 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.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日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.mmm (mmm 是毫秒,可选,您还可以指定微秒或纳秒)。 您还可以使用相对时间 now(),它指的是服务器的当前时间戳:
SELECT * FROM "foodships" WHERE time > now() - 1h
该查询输出在foodships度量中时间戳晚于服务器当前时间减去一小时的数据。
使用now()指定时间持续时间的选项是:
| 字母 | 含义 |
|---|---|
| 纳秒 | 纳秒 |
| u 或 µ | 微秒 |
| 毫秒 | 毫秒 |
| s | 秒 |
| m | 分钟 |
| 小时 | 小时 |
| d | 天数 |
| w | 周 |
InfluxQL 还支持正则表达式、表达式中的算术运算、SHOW 语句和 GROUP BY 语句。 查看我们的 数据探索 页面以深入讨论这些主题。 InfluxQL 函数包括 COUNT、MIN、MAX、MEDIAN、DERIVATIVE 等。 要查看完整列表,请查看 函数 页面。
现在你已经有了大致的想法,查看我们的 入门指南。
InfluxDB 不是 CRUD
InfluxDB 是一个为时间序列数据优化的数据库。 这些数据通常来自分布式传感器组、大型网站的点击数据或金融交易列表。
这些数据的一个共同点是,它们在总体上更有用。 单单查看您计算机的CPU在UTC时间星期二12:38:35的利用率为12%很难得出结论。 当与其他系列结合并进行可视化时,它变得更有用。 在这里,随着时间的推移,趋势开始显现,可以从数据中得出可行的见解。 此外,时间序列数据通常一次写入,少有更新。
结果是 InfluxDB 不是一个完整的 CRUD 数据库,而更像是一个 CR-ud,优先考虑创建和读取数据的性能,而不是更新和销毁,并且 防止了一些更新和销毁行为 以提高创建和读取的性能:
- 要更新一个点,请插入一个具有 相同测量、标签集合和时间戳 的点。
- 您可以 删除或删除一个系列,但不能基于字段值删除单个点。作为一种解决方法,您可以搜索字段值,检索时间,然后 基于
time字段 DELETE。 - 您还不能更新或重命名标签 - 请参见 GitHub 问题 #4157 以获取更多信息。要修改一系列点的标签,请找到带有错误标签值的点,将值更改为所需的值,然后将点写回,再删除带有旧标签值的系列。
- 你不能通过标签键(而不是值)删除标签 - 请参见GitHub问题 #8604。