文档说明

InfluxQL参考文档

InfluxQL(Influx查询语言)是一种类似于SQL的查询语言,用于与InfluxDB交互并处理时间序列数据。

InfluxQL功能支持

InfluxQL正在重构以与InfluxDB 3.0存储引擎协同工作。此过程正在进行中,并且InfluxQL的一些功能仍在实现中。有关InfluxQL功能的当前实现状态信息,请参阅InfluxQL功能支持

表示法

语法使用扩展巴科斯-诺尔范式(“EBNF”)指定。EBNF是Go编程语言规范中使用的相同表示法。

Production  = production_name "=" [ Expression ] "." .
Expression  = Alternative { "|" Alternative } .
Alternative = Term { Term } .
Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
Group       = "(" Expression ")" .
Option      = "[" Expression "]" .
Repetition  = "{" Expression "}" .

按优先级递增的表示法运算符

|   alternation
()  grouping
[]  option (0 or 1 times)
{}  repetition (0 to n times)

查询表示

字符

InfluxQL是UTF-8编码的Unicode文本。

newline             = /* the Unicode code point U+000A */ .
unicode_char        = /* an arbitrary Unicode code point except newline */ .

字母和数字

字母是ASCII字母和下划线(_,U+005F)的集合。

仅支持十进制数字。

letter              = ascii_letter | "_" .
ascii_letter        = "A" … "Z" | "a" … "z" .
digit               = "0" … "9" .

标识符

标识符是引用数据库名保留策略名度量名标签键字段键的标记。

规则如下

  • 双引号标识符可以包含任何Unicode字符,但不能包含换行符。
  • 双引号标识符还可以包含转义的双引号字符(即\")。
  • 双引号标识符可以包含InfluxQL 关键字
  • 无引号标识符必须以大写或小写ASCII字符或“_”开头。
  • 无引号标识符可以包含ASCII字母、十进制数字和“_”。
identifier          = unquoted_identifier | quoted_identifier .
unquoted_identifier = ( letter ) { letter | digit } .
quoted_identifier   = `"` unicode_char { unicode_char } `"` .

示例

cpu
_cpu_stats
"1h"
"anything really"
"1_Crazy-1337.identifier>NAME👍"

关键字

ALL           ALTER         ANY           AS            ASC           BEGIN
BY            CREATE        CONTINUOUS    DATABASE      DATABASES     DEFAULT
DELETE        DESC          DESTINATIONS  DIAGNOSTICS   DISTINCT      DROP
DURATION      END           EVERY         EXPLAIN       FIELD         FOR
FROM          GRANT         GRANTS        GROUP         GROUPS        IN
INF           INSERT        INTO          KEY           KEYS          KILL
LIMIT         SHOW          MEASUREMENT   MEASUREMENTS  NAME          OFFSET
ON            ORDER         PASSWORD      POLICY        POLICIES      PRIVILEGES
QUERIES       QUERY         READ          REPLICATION   RESAMPLE      RETENTION
REVOKE        SELECT        SERIES        SET           SHARD         SHARDS
SLIMIT        SOFFSET       STATS         SUBSCRIPTION  SUBSCRIPTIONS TAG
TO            USER          USERS         VALUES        WHERE         WITH
WRITE

如果您将InfluxQL关键字用作标识符,则必须在每个查询中用双引号引起来。

time关键字是一个特殊情况。time可以是数据库名、度量名、保留策略名和用户名。

在这些情况下,您不需要在查询中对time进行双引号。

time不能是字段键标签键;InfluxDB拒绝使用time作为字段键或标签键的写入,并返回错误。

字面量

整数

InfluxQL支持十进制整数文字。目前不支持十六进制和八进制文字。

int_lit             = ( "1" … "9" ) { digit } .

浮点数

InfluxQL支持浮点数文字。目前不支持指数。

float_lit           = int_lit "." int_lit .

字符串

字符串文字必须用单引号包围。只要它们是转义的(即\'),字符串中可以包含单引号字符。

string_lit          = `'` { unicode_char } `'` .

持续时间

持续时间文字指定时间的长度。一个整数文字紧接着下面列出的持续时间单位之一(没有空格)被解释为持续时间文字。持续时间可以用混合单位指定。

持续时间单位
单位含义
ns纳秒(秒的1亿分之一)
u或µ微秒(秒的1百万分之一)
ms毫秒(秒的1千分之一)
s
m分钟
h小时
d
w
duration_lit        = int_lit duration_unit .
duration_unit       = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .

日期和时间

与InfluxQL中使用的其他符号不同,日期和时间文字的格式不是由EBNF指定的。InfluxQL的日期和时间使用Go的时间解析格式和参考日期指定,格式符合InfluxQL的要求。参考日期时间是

InfluxQL参考日期时间:2006年1月2日星期二下午3:04:05

time_lit            = "2006-01-02 15:04:05.999999" | "2006-01-02" .

布尔值

bool_lit            = TRUE | FALSE .

正则表达式

regex_lit           = "/" { unicode_char } "/" .

比较运算符: =~ 匹配,而 !~ 不匹配

InfluxQL支持在指定时使用正则表达式

目前,InfluxQL不支持在WHERE子句、数据库保留策略中使用正则表达式来匹配非字符串字段值。

查询

查询由一个或多个用分号(;)分隔的语句组成。

query               = statement { ";" statement } .

statement           = explain_stmt |
                      explain_analyze_stmt |
                      select_stmt |
                      show_field_keys_stmt |
                      show_measurements_stmt |
                      show_retention_policies_stmt |
                      show_tag_keys_stmt |
                      show_tag_values_with_key = stmt .

语句

EXPLAIN

解析和计划查询,然后打印估计成本的摘要。

许多SQL引擎使用EXPLAIN语句来显示连接顺序、连接算法、谓词和表达式推送下。由于InfluxQL不支持连接,InfluxQL查询的成本通常取决于访问的总系列、访问TSM文件的迭代器次数以及需要扫描的TSM块数量。

EXPLAIN 生成的查询计划包含以下元素:

  • 表达式
  • 辅助字段
  • 分片数量
  • 系列数量
  • 缓存值
  • 文件数量
  • 块数量
  • 块大小
explain_stmt = "EXPLAIN" select_stmt .

示例

> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
> QUERY PLAN
------
EXPRESSION: sum(pointReq::integer)
NUMBER OF SHARDS: 2
NUMBER OF SERIES: 2
CACHED VALUES: 110
NUMBER OF FILES: 1
NUMBER OF BLOCKS: 1
SIZE OF BLOCKS: 931

EXPLAIN ANALYZE

执行指定的 SELECT 语句,并在运行时返回关于查询性能和存储的数据,以树形图的形式可视化。使用此语句分析查询性能和存储,包括 执行时间规划时间,以及 迭代器类型游标类型

例如,如果您执行以下语句

> explain analyze select mean(usage_steal) from cpu where time >= '2018-02-22T00:00:00Z' and time < '2018-02-22T12:00:00Z'

输出类似于以下内容

EXPLAIN ANALYZE
---------------
.
└── select
    ├── execution_time: 2.25823ms
    ├── planning_time: 18.381616ms
    ├── total_time: 20.639846ms
    └── field_iterators
        ├── labels
           └── statement: SELECT mean(usage_steal::float) FROM telegraf."default".cpu
        └── expression
            ├── labels
               └── expr: mean(usage_steal::float)
            └── create_iterator
                ├── labels
                   ├── measurement: cpu
                   └── shard_id: 608
                ├── cursors_ref: 779
                ├── cursors_aux: 0
                ├── cursors_cond: 0
                ├── float_blocks_decoded: 431
                ├── float_blocks_size_bytes: 1003552
                ├── integer_blocks_decoded: 0
                ├── integer_blocks_size_bytes: 0
                ├── unsigned_blocks_decoded: 0
                ├── unsigned_blocks_size_bytes: 0
                ├── string_blocks_decoded: 0
                ├── string_blocks_size_bytes: 0
                ├── boolean_blocks_decoded: 0
                ├── boolean_blocks_size_bytes: 0
                └── planning_time: 14.805277ms```

EXPLAIN ANALYZE 忽略查询输出,因此将序列化为 JSON 或 CSV 的成本不计入。

execution_time

显示查询执行所需的时间,包括读取时间序列数据、在迭代器中执行操作以及从迭代器中排空处理过的数据。执行时间不包括将输出序列化为 JSON 或其他格式的耗时。

planning_time

显示查询规划所需的时间。在 InfluxDB 中规划查询需要多个步骤。根据查询的复杂性,规划可能需要更多的工作,并且比执行查询消耗更多的 CPU 和内存资源。例如,执行查询所需的系列键的数量会影响查询规划的速度以及规划所需的内存量。

首先,InfluxDB 确定查询的有效时间范围并选择要访问的分片。接下来,对于每个分片和每个度量,InfluxDB 执行以下步骤

  1. 从索引中选择匹配的系列键,并通过 WHERE 子句中的标签谓词进行过滤。
  2. 根据 GROUP BY 维度将过滤后的系列键分组到标签集中。
  3. 枚举每个标签集并为每个系列键创建游标和迭代器。
  4. 合并迭代器并将合并后的结果返回给查询执行器。
iterator type

EXPLAIN ANALYZE 支持以下迭代器类型

  • create_iterator 节点表示由本地 influxd 实例完成的工作──一个复杂的嵌套迭代器的组合和合并,以产生最终的查询输出。
  • (仅限 InfluxDB Enterprise) remote_iterator 节点表示在远程机器上完成的工作。

有关迭代器的更多信息,请参阅 理解迭代器

cursor type

EXPLAIN ANALYZE 区分 3 种游标类型。虽然游标类型具有相同的数据结构和相等的 CPU 和 I/O 成本,但每种游标类型都是为了不同的原因构建并分开在最终输出中。在调整语句时考虑以下游标类型

  • cursor_ref:为包含函数的 SELECT 投影(如 last()mean())创建的引用游标。
  • cursor_aux:为简单的表达式投影(非选择器或聚合)创建的辅助游标。例如,SELECT foo FROM mSELECT foo+bar FROM m,其中 foobar 是字段。
  • cursor_cond:为在 WHERE 子句中引用的字段创建的条件游标。

有关游标的更多信息,请参阅理解游标

块类型

EXPLAIN ANALYZE将存储块类型分开,并报告解码的总块数及其在磁盘上的大小(以字节为单位)。以下块类型受支持

类型描述
float64位IEEE-754浮点数
整数64位有符号整数
无符号64位无符号整数
布尔值1位,LSB编码
字符串UTF-8字符串

SELECT

select_stmt = "SELECT" fields from_clause [ where_clause ]
              [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
              [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .

示例

按带时区的一天分组选择测量

SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')

SHOW FIELD KEYS

show_field_keys_stmt = "SHOW FIELD KEYS" [on_clause] [ from_clause ] .

示例

-- show field keys and field value data types from all measurements
SHOW FIELD KEYS

-- show field keys and field value data types from specified measurement
SHOW FIELD KEYS FROM "cpu"

SHOW MEASUREMENTS

show_measurements_stmt = "SHOW MEASUREMENTS" [on_clause] [ with_measurement_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .

示例

-- show all measurements
SHOW MEASUREMENTS

-- show measurements where region tag = 'uswest' AND host tag = 'serverA'
SHOW MEASUREMENTS WHERE "region" = 'uswest' AND "host" = 'serverA'

-- show measurements that start with 'h2o'
SHOW MEASUREMENTS WITH MEASUREMENT =~ /h2o.*/

SHOW TAG KEYS

show_tag_keys_stmt = "SHOW TAG KEYS" [on_clause] [ from_clause ] [ where_clause ]
                     [ limit_clause ] [ offset_clause ] .

示例

-- show all tag keys
SHOW TAG KEYS

-- show all tag keys from the cpu measurement
SHOW TAG KEYS FROM "cpu"

-- show all tag keys from the cpu measurement where the region key = 'uswest'
SHOW TAG KEYS FROM "cpu" WHERE "region" = 'uswest'

-- show all tag keys where the host key = 'serverA'
SHOW TAG KEYS WHERE "host" = 'serverA'

SHOW TAG VALUES

show_tag_values_stmt = "SHOW TAG VALUES" [on_clause] [ from_clause ] with_tag_clause [ where_clause ]
                       [ limit_clause ] [ offset_clause ] .

示例

-- show all tag values across all measurements for the region tag
SHOW TAG VALUES WITH KEY = "region"

-- show tag values from the cpu measurement for the region tag
SHOW TAG VALUES FROM "cpu" WITH KEY = "region"

-- show tag values across all measurements for all tag keys that do not include the letter c
SHOW TAG VALUES WITH KEY !~ /.*c.*/

-- show tag values from the cpu measurement for region & host tag keys where service = 'redis'
SHOW TAG VALUES FROM "cpu" WITH KEY IN ("region", "host") WHERE "service" = 'redis'

子句

from_clause     = "FROM" measurements .

group_by_clause = "GROUP BY" dimensions fill(fill_option).

limit_clause    = "LIMIT" int_lit .

offset_clause   = "OFFSET" int_lit .

slimit_clause   = "SLIMIT" int_lit .

soffset_clause  = "SOFFSET" int_lit .

timezone_clause = tz(string_lit) .

on_clause       = "ON" db_name .

order_by_clause = "ORDER BY" sort_fields .

where_clause    = "WHERE" expr .

with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .

with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")"  ) .

表达式

binary_op        = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" |
                   "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .

expr             = unary_expr { binary_op unary_expr } .

unary_expr       = "(" expr ")" | var_ref | time_lit | string_lit | int_lit |
                   float_lit | bool_lit | duration_lit | regex_lit .

默认时间范围

默认时间范围是Unix纪元(1970-01-01T00:00:00Z)到现在

注释

使用InfluxQL语句的注释来描述您的查询。

  • 单行注释以两个连字符(--)开头,并在InfluxDB检测到行中断处结束。此注释类型不能跨越多行。
  • 多行注释以/*开头,以*/结尾。此注释类型可以跨越多行。多行注释不支持嵌套的多行注释。

其他

alias            = "AS" identifier .

back_ref         = ( policy_name ".:MEASUREMENT" ) |
                   ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .

db_name          = identifier .

dimension        = expr .

dimensions       = dimension { "," dimension } .

field_key        = identifier .

field            = expr [ alias ] .

fields           = field { "," field } .

fill_option      = "null" | "none" | "previous" | int_lit | float_lit | "linear" .

host             = string_lit .

measurement      = measurement_name |
                   ( policy_name "." measurement_name ) |
                   ( db_name "." [ policy_name ] "." measurement_name ) .

measurements     = measurement { "," measurement } .

measurement_name = identifier | regex_lit .

policy_name      = identifier .

retention_policy = identifier .

retention_policy_name = "NAME" identifier .

series_id        = int_lit .

sort_field       = field_key [ ASC | DESC ] .

sort_fields      = sort_field { "," sort_field } .

tag_key          = identifier .

tag_keys         = tag_key { "," tag_key } .

var_ref          = measurement .

这个页面有帮助吗?

感谢您的反馈!


Flux的未来

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

阅读更多

InfluxDB v3增强功能和InfluxDB Clustered现在已普遍可用

新功能,包括更快的查询性能和管理工具,推进了InfluxDB v3产品线。InfluxDB Clustered现在已普遍可用。

InfluxDB v3性能和功能

InfluxDB v3产品线在查询性能方面取得了显著增强,并提供了新的管理工具。这些增强包括用于监控InfluxDB集群健康情况的操作仪表板、InfluxDB Cloud Dedicated中的单点登录(SSO)支持以及用于令牌和数据库的新管理API。

了解新的v3增强功能


InfluxDB Clustered普遍可用

InfluxDB Clustered现在已普遍可用,并为您在自管理的堆栈中提供了InfluxDB v3的功能。

与我们谈谈InfluxDB Clustered