InfluxQL是一種類似SQL的查詢語言,用於與TSDB For InfluxDB®進行互動並提供專門用於儲存和分析時序資料的功能。本文檔是Influx查詢語言(InfluxQL)的參考文檔。
符號
使用Extended Backus-Naur Form(“EBNF”)指定文法。EBNF與Go語言規範中使用的符號相同。這不是巧合,因為TSDB For InfluxDB®就是用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)的集合,底線(U+005F)被認為是字母。
InfluxQL只支援十進位數字。
letter = ascii_letter | "_" .
ascii_letter = "A" … "Z" | "a" … "z" .
digit = "0" … "9" .標識符
標識符指的是資料庫名字、保留原則名字、使用者名稱、measurement的名字、tag key和field key。
規則:
用雙引號括起來的標識符可以包含除分行符號(new line)之外的任意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可以是一個連續查詢名字、資料庫名字、measurement的名字、保留原則名字、subscription的名字和使用者名稱。在這些情況下,不需要在查詢中用雙引號將time括起來。time不能是field key或tag key;TSDB For InfluxDB®拒絕寫入將time作為field key或tag key的資料,對於這種資料寫入,TSDB For InfluxDB®會返回錯誤。請查閱FAQ獲得更多相關資訊。
文字
整數
InfluxQL支援十進位的整數。目前不支援十六進位和八進位。
int_lit = ( "1" … "9" ) { digit } .浮點數
InfluxQL支援浮點數。目前不支援指數。
float_lit = int_lit "." int_lit .字串
字串必須用單引號括起來。字串可以包含轉義的'字元(也就是\')。
string_lit = `'` { unicode_char } `'` .期間
期間(duration)指定了一段時間的長度。整數後面緊跟著(沒有空格)以下列出的一個時間單位表示duration literal。可使用混合單位指定期間。
期間單位
單位 | 含義 |
ns | 納秒(十億分之一秒) |
u或µ | 微秒(百萬分之一秒) |
ms | 毫秒(千分之一秒) |
s | 秒 |
m | 分鐘 |
h | 小時 |
d | 天 |
w | 星期 |
duration_lit = int_lit duration_unit .
duration_unit = "ns" | "u" | "µ" | "ms" | "s" | "m" | "h" | "d" | "w" .日期和時間
與本文檔的其它部分一樣,日期和時間的格式沒有指定為EBNF,而是使用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
regex_lit = "/" { unicode_char } "/" .比較:=~ 匹配 !~ 不匹配
InfluxQL支援使用Regex,當指定: SELECT子句中的field key和tag key FROM子句中的measurement WHERE子句中的tag value GROUP BY子句中的tag key 目前,InfluxQL不支援使用Regex匹配WHERE子句、資料庫和保留原則中的非字串類型的field value。
查詢
查詢由一個或多個以分號分隔的語句組成。
query = statement { ";" statement } .
statement = alter_retention_policy_stmt |
create_continuous_query_stmt |
create_database_stmt |
create_retention_policy_stmt |
create_subscription_stmt |
create_user_stmt |
delete_stmt |
drop_continuous_query_stmt |
drop_database_stmt |
drop_measurement_stmt |
drop_retention_policy_stmt |
drop_series_stmt |
drop_shard_stmt |
drop_subscription_stmt |
drop_user_stmt |
explain_stmt |
explain_analyze_stmt |
grant_stmt |
kill_query_statement |
revoke_stmt |
select_stmt |
show_continuous_queries_stmt |
show_databases_stmt |
show_diagnostics_stmt |
show_field_key_cardinality_stmt |
show_field_keys_stmt |
show_grants_stmt |
show_measurement_cardinality_stmt |
show_measurement_exact_cardinality_stmt |
show_measurements_stmt |
show_queries_stmt |
show_retention_policies_stmt |
show_series_cardinality_stmt |
show_series_exact_cardinality_stmt |
show_series_stmt |
show_shard_groups_stmt |
show_shards_stmt |
show_stats_stmt |
show_subscriptions_stmt |
show_tag_key_cardinality_stmt |
show_tag_key_exact_cardinality_stmt |
show_tag_keys_stmt |
show_tag_values_stmt |
show_tag_values_cardinality_stmt |
show_users_stmt .語句
DELETE
阿里雲InfluxDB資料庫支援刪除資料的操作,但InfluxDB核心對刪除操作存在死結風險,可能會引起讀寫失敗,建議您避免執行刪除操作。
delete_stmt = "DELETE" ( from_clause | where_clause | from_clause where_clause ) .樣本:
DELETE FROM "cpu"
DELETE FROM "cpu" WHERE time < '2000-01-01T00:00:00Z'
DELETE WHERE time < '2000-01-01T00:00:00Z'EXPLAIN
解析並計劃查詢,然後列印查詢預計開銷的摘要。
很多SQL引擎使用EXPLAIN語句來顯示join順序、join演算法以及謂詞和運算式下推(predicate and expression pushdown)。由於InfluxQL不支援join,一個InfluxQL查詢的開銷通常是一個關於訪問的總時間序列、訪問TSM檔案的迭代器數量和需要掃描的TSM block的數量的函數。
EXPLAIN查詢計劃的內容包括:
運算式(expression)
輔助field(auxiliary fields)
shard的數量(number of shards)
序列的數量(number of series)
緩衝的值(cached values)
檔案的數量(number of files)
block的數量(number of blocks)
block的大小(size of blocks)
樣本:
> 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: 931EXPLAIN ANALYZE
執行查詢並計算運行時的實際開銷。
explain_analyze_stmt = "EXPLAIN ANALYZE" select_stmt .樣本:
> explain analyze select sum(pointReq) from "_internal"."monitor"."write" group by hostname;
> EXPLAIN ANALYZE
-----------
.
└── select
├── execution_time: 242.167µs
├── planning_time: 2.165637ms
├── total_time: 2.407804ms
└── field_iterators
├── labels
│ └── statement: SELECT sum(pointReq::integer) FROM "_internal"."monitor"."write" GROUP BY hostname
└── expression
├── labels
│ └── expr: sum(pointReq::integer)
├── create_iterator
│ ├── labels
│ │ ├── measurement: write
│ │ └── shard_id: 57
│ ├── cursors_ref: 1
│ ├── cursors_aux: 0
│ ├── cursors_cond: 0
│ ├── float_blocks_decoded: 0
│ ├── float_blocks_size_bytes: 0
│ ├── integer_blocks_decoded: 1
│ ├── integer_blocks_size_bytes: 931
│ ├── 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: 1.401099ms
└── create_iterator
├── labels
│ ├── measurement: write
│ └── shard_id: 58
├── cursors_ref: 1
├── cursors_aux: 0
├── cursors_cond: 0
├── float_blocks_decoded: 0
├── float_blocks_size_bytes: 0
├── 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: 76.192µsKILL QUERY
中斷當前正在啟動並執行查詢。
kill_query_statement = "KILL QUERY" query_id .其中,query_id是查詢ID,在SHOW QUERIES輸出中顯示為”qid”。
樣本:
-- kill query with qid of 36 on the local host
KILL QUERY 36SELECT
select_stmt = "SELECT" fields from_clause [ into_clause ] [ where_clause ]
[ group_by_clause ] [ order_by_clause ] [ limit_clause ]
[ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ] .樣本:
從所有以”cpu”開頭的measurement中選擇資料,並將資料寫入相同的measurement但保留原則為”cpu_1h”中。
SELECT mean("value") INTO "cpu_1h".:MEASUREMENT FROM /cpu.*/查詢measurement中的資料,並將結果按天進行分組(帶有時區)。
SELECT mean("value") FROM "cpu" GROUP BY region, time(1d) fill(0) tz('America/Chicago')SHOW CARDINALITY
指用於估計或精確計算measurement、序列、tag key、tag value和field key的基數的一組命令。
SHOW CARDINALITY命令有兩種可用的版本:估計和精確。估計值使用草圖進行計算,對於所有基數大小來說,這是一個安全預設值。精確值是直接對TSM(Time-Structured Merge Tree)資料進行計數,但是,對於基數大的資料來說,運行成本很高。除非必須要使用,否則,請使用估計的方法。
當資料庫啟用Time Series Index(TSI)時,才支援對time進行過濾。
請查看特定的SHOW CARDINALITY命令獲得更多資訊:
SHOW FIELD KEY CARDINALITY
SHOW MEASUREMENT CARDINALITY
SHOW SERIES CARDINALITY
SHOW TAG KEY CARDINALITY
SHOW TAG VALUES CARDINALITY
SHOW CONTINUOUS QUERIES
show_continuous_queries_stmt = "SHOW CONTINUOUS QUERIES" .樣本:
-- show all continuous queries
SHOW CONTINUOUS QUERIESSHOW DATABASES
show_databases_stmt = "SHOW DATABASES" .樣本:
-- show all databases
SHOW DATABASESSHOW DIAGNOSTICS
顯示節點資訊,例如構建資訊、已耗用時間、主機名稱、伺服器配置、記憶體使用量情況和Go運行時診斷。
show_diagnostics_stmt = "SHOW DIAGNOSTICS"SHOW FIELD KEY CARDINALITY
除非使用ON <database>指定資料庫,否則估計或精確計算當前資料庫的field key集的基數。
ON <database>、FROM <sources>、WITH KEY = <key>、WHERE <condition>、GROUP BY <dimensions>和LIMIT/OFFSET子句是可選的。當使用這些查詢子句時,查詢將回退到精確計數(exact count)。當啟用Time Series Index(TSI)時,才支援對time進行過濾。不支援在WHERE子句中使用time。
show_field_key_cardinality_stmt = "SHOW FIELD KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
show_field_key_exact_cardinality_stmt = "SHOW FIELD KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]樣本:
-- show estimated cardinality of the field key set of current database
SHOW FIELD KEY CARDINALITY
-- show exact cardinality on field key set of specified database
SHOW FIELD KEY EXACT CARDINALITY ON mydbSHOW FIELD KEY
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 GRANTS
show_grants_stmt = "SHOW GRANTS FOR" user_name .樣本:
-- show grants for jdoe
SHOW GRANTS FOR "jdoe"SHOW MEASUREMENT CARDINALITY
除非使用ON <database>指定資料庫,否則估計或精確計算當前資料庫的measurement集的基數。
ON <database>、FROM <sources>、WITH KEY = <key>、WHERE <condition>、GROUP BY <dimensions>和LIMIT/OFFSET子句是可選的。當使用這些查詢子句時,查詢將回退到精確計數(exact count)。當啟用Time Series Index(TSI)時,才支援對time進行過濾。不支援在WHERE子句中使用time。
show_measurement_cardinality_stmt = "SHOW MEASUREMENT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
show_measurement_exact_cardinality_stmt = "SHOW MEASUREMENT EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]樣本:
-- show estimated cardinality of measurement set on current database
SHOW MEASUREMENT CARDINALITY
-- show exact cardinality of measurement set on specified database
SHOW MEASUREMENT EXACT CARDINALITY ON mydbSHOW 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 QUERIES
show_queries_stmt = "SHOW QUERIES" .樣本:
-- show all currently-running queries
SHOW QUERIESSHOW RETENTION POLICIES
show_retention_policies_stmt = "SHOW RETENTION POLICIES" [on_clause] .樣本:
-- show all retention policies on a database
SHOW RETENTION POLICIES ON "mydb"SHOW SERIES
show_series_stmt = "SHOW SERIES" [on_clause] [ from_clause ] [ where_clause ] [ limit_clause ] [ offset_clause ] .樣本:
SHOW SERIES FROM "telegraf"."autogen"."cpu" WHERE cpu = 'cpu8'SHOW SERIES CARDINALITY
除非使用ON <database>指定資料庫,否則估計或精確計算當前資料庫的序列的基數。
序列基數是影響記憶體(RAM)使用量的主要因素。
ON <database>、FROM <sources>、WITH KEY = <key>、WHERE <condition>、GROUP BY <dimensions>和LIMIT/OFFSET子句是可選的。當使用這些查詢子句時,查詢將回退到精確計數(exact count)。當啟用Time Series Index(TSI)時,才支援對time進行過濾。不支援在WHERE子句中使用time。
show_series_cardinality_stmt = "SHOW SERIES CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
show_series_exact_cardinality_stmt = "SHOW SERIES EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]樣本:
-- show estimated cardinality of the series on current database
SHOW SERIES CARDINALITY
-- show estimated cardinality of the series on specified database
SHOW SERIES CARDINALITY ON mydb
-- show exact series cardinality
SHOW SERIES EXACT CARDINALITY
-- show series cardinality of the series on specified database
SHOW SERIES EXACT CARDINALITY ON mydbSHOW SHARD GROUPS
show_shard_groups_stmt = "SHOW SHARD GROUPS" .樣本:
SHOW SHARD GROUPSSHOW SHARD
show_shards_stmt = "SHOW SHARDS" .樣本:
SHOW SHARDSSHOW STATS
返回一個TSDB For InfluxDB®節點和可用(以啟用)的組件的可用組件的詳細統計資訊。
show_stats_stmt = "SHOW STATS [ FOR '<component>' | 'indexes' ]"SHOW STATS
SHOW STATS命令不會列出關於索引的記憶體使用量量—請使用SHOW STATS FOR 'indexes'命令。SHOW STATS返回的統計資訊儲存在記憶體中,並且在節點重啟時重新設定為0,但是,每10秒會觸發一次SHOW STATS來填充資料庫_internal。
SHOW STATS FOR <component>
該命令返回指定組件(\)的統計資訊。
對於
runtime組件,該命令使用Go runtime返回TSDB For InfluxDB®系統的記憶體使用量量概要。
SHOW STATS FOR 'indexes'
該命令返回所有索引的記憶體使用量量,這是一個估計值。
SHOW STATS不會列出索引的記憶體使用量量,因為這可能是一個很耗資源的操作。
樣本:
> show stats
name: runtime
-------------
Alloc Frees HeapAlloc HeapIdle HeapInUse HeapObjects HeapReleased HeapSys Lookups Mallocs NumGC NumGoroutine PauseTotalNs Sys TotalAlloc
4136056 6684537 4136056 34586624 5816320 49412 0 40402944 110 6733949 83 44 36083006 46692600 439945704
name: graphite
tags: proto=tcp
batches_tx bytes_rx connections_active connections_handled points_rx points_tx
---------- -------- ------------------ ------------------- --------- ---------
159 3999750 0 1 158110 158110SHOW SUBSCRIPTIONS
show_subscriptions_stmt = "SHOW SUBSCRIPTIONS" .樣本:
SHOW SUBSCRIPTIONSSHOW TAG KEY CARDINALITY
除非使用ON <database>指定資料庫,否則估計或精確計算當前資料庫的tag key集的基數。
ON <database>、FROM <sources>、WITH KEY = <key>、WHERE <condition>、GROUP BY <dimensions>和LIMIT/OFFSET子句是可選的。當使用這些查詢子句時,查詢將回退到精確計數(exact count)。當啟用Time Series Index(TSI)時,才支援對time進行過濾。不支援在WHERE子句中使用time。
show_tag_key_cardinality_stmt = "SHOW TAG KEY CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]
show_tag_key_exact_cardinality_stmt = "SHOW TAG KEY EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ]樣本:
-- show estimated tag key cardinality
SHOW TAG KEY CARDINALITY
-- show exact tag key cardinality
SHOW TAG KEY EXACT CARDINALITYSHOW 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'SHOW TAG VALUES CARDINALITY
除非使用ON <database>指定資料庫,否則估計或精確計算當前資料庫的指定tag key對應的tag value的基數。
ON <database>、FROM <sources>、WITH KEY = <key>、WHERE <condition>、GROUP BY <dimensions>和LIMIT/OFFSET子句是可選的。當使用這些查詢子句時,查詢將回退到精確計數(exact count)。當啟用Time Series Index(TSI)時,才支援對time進行過濾。
show_tag_values_cardinality_stmt = "SHOW TAG VALUES CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause
show_tag_values_exact_cardinality_stmt = "SHOW TAG VALUES EXACT CARDINALITY" [ on_clause ] [ from_clause ] [ where_clause ] [ group_by_clause ] [ limit_clause ] [ offset_clause ] with_key_clause樣本:
-- show estimated tag key values cardinality for a specified tag key
SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
-- show estimated tag key values cardinality for a specified tag key
SHOW TAG VALUES CARDINALITY WITH KEY = "myTagKey"
-- show exact tag key values cardinality for a specified tag key
SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"
-- show exact tag key values cardinality for a specified tag key
SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "myTagKey"SHOW USERS
show_users_stmt = "SHOW USERS" .樣本:
-- show all users
SHOW USERS子句
from_clause = "FROM" measurements .
group_by_clause = "GROUP BY" dimensions fill(fill_option).
into_clause = "INTO" ( measurement | back_ref ).
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 .
to_clause = "TO" user_name .
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 .其它
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 .
password = string_lit .
policy_name = identifier .
privilege = "ALL" [ "PRIVILEGES" ] | "READ" | "WRITE" .
query_id = int_lit .
query_name = identifier .
retention_policy = identifier .
retention_policy_option = retention_policy_duration |
retention_policy_replication |
retention_policy_shard_group_duration |
"DEFAULT" .
retention_policy_duration = "DURATION" duration_lit .
retention_policy_replication = "REPLICATION" int_lit .
retention_policy_shard_group_duration = "SHARD DURATION" duration_lit .
retention_policy_name = "NAME" identifier .
series_id = int_lit .
shard_id = int_lit .
sort_field = field_key [ ASC | DESC ] .
sort_fields = sort_field { "," sort_field } .
subscription_name = identifier .
tag_key = identifier .
tag_keys = tag_key { "," tag_key } .
user_name = identifier .
var_ref = measurement .注釋
在InfluxQL語句中使用注釋來描述您的查詢。
單行注釋以兩個連字號(
--)開頭,並且在TSDB For InfluxDB®檢測到分行符號時結束。這種注釋方式不能跨越多行。多行注釋以
/*開頭,並且以*/結束。這種注釋方式可以跨越多行。多行注釋不支援嵌套的多行注釋。
查詢引擎內部
一旦您理解了語言本身,瞭解如何在查詢引擎中實現這些語言結構是十分重要的,因為這樣可以使您直觀地瞭解如何處理結果和如何建立有效查詢。
一個查詢的生命週期如下所示:
符號化InfluxQL查詢語句,然後解析成一個抽象文法樹(abstract syntac tree,簡稱AST)。這是查詢本身的代碼錶示。
將AST傳給
QueryExecutor,它將查詢定向到合適的處理器(handler)。例如,與中繼資料相關的查詢由中繼資料服務執行,SELECT語句由shard本身執行。然後,查詢引擎確定與
SELECT語句中的時間範圍匹配的shard。在這些shard中,為語句中的每個field建立迭代器(iterator)。將迭代器傳到發射器(emitter),發射器將它們排出並串連結果中的資料點。發射器的工作是將簡單的time/value資料點轉換為更複雜的結果返回給用戶端。
理解迭代器
迭代器是查詢引擎的核心。迭代器提供一個簡單的介面,用於迴圈遍曆一組資料點。例如,這是浮點數上的迭代器:
type FloatIterator interface {
Next() *FloatPoint
}通過介面IteratorCreator建立迭代器:
type IteratorCreator interface {
CreateIterator(opt *IteratorOptions) (Iterator, error)
}IteratorOptions提供關於field選擇、時間範圍和維度參數,使得迭代器建立者在規劃迭代器的時候可以使用這些參數。介面IteratorCreator可以在多個層面使用,例如Shards、Shard和Engine。這允許在適當的時候執行最佳化,例如返回預計算的COUNT()。
迭代器不僅僅用於從儲存中讀取未經處理資料,迭代器還可以組合使用,以便它們為輸入迭代器(input iterator)提供額外的功能。例如,迭代器DistinctIterator可以為輸入迭代器計算每個時間視窗的不同的值,或者,迭代器FillIterator可以產生輸入迭代器中缺少的資料點。
這種組合也很適合用於彙總。例如,以下語句:
SELECT MEAN(value) FROM cpu GROUP BY time(10m)在這種情況下,MEAN(value)是一個迭代器MeanIterator,它從底層的shard中封裝一個迭代器。然而,我們可以添加一個額外的迭代器來決定這些平均值的導數:
SELECT DERIVATIVE(MEAN(value), 20m) FROM cpu GROUP BY time(10m)理解輔助field
因為InfluxQL允許使用者使用selector函數,例如,FIRST()、LAST()、MIN()和MAX(),所以查詢引擎必須提供一種與選定資料點同時返回相關資料的方法。
例如,以下查詢:
SELECT FIRST(value), host FROM cpu GROUP BY time(1h)我們查詢每小時發生的第一個value,同時我們也要獲得該資料點對應的host。因為效率問題,Point類型只指定了一個value類型,所以我們將host推送到該資料點的輔助field。這些輔助field將附加到資料點,直到它被傳送到發射器(在那裡field會被拆分到它們自己的迭代器)。
內建迭代器
有許多輔助迭代器(helper iterators)可以讓我們構建查詢:
Merge Iterator(合并迭代器):該迭代器將一個或多個迭代器合并成一個有相同類型的新的迭代器。該迭代器保證在開始下一個視窗之前輸出當前視窗內的所有資料點,但是並不保證視窗內的資料點已經排好序,這使得不需要更高排序要求的彙總查詢能夠快速存取。
Sorted Merge Iterator(排序合并迭代器):該迭代器也將一個或多個迭代器合并成一個有相同類型的新的迭代器。但是,該迭代器保證每個資料點都是按時間排好序的。這使得它的速度比
MergeIterator慢,但是對於返回未經處理資料點的非彙總查詢,這種排序保證是必須的。Limit Iterator(限制迭代器):該迭代器限制了每個name/tag組的資料點個數。這是
LIMIT和OFFSET文法的實現。Fill Iterator(填充迭代器):該迭代器用額外的資料點填充在輸入迭代器中缺失的資料點,它可以提供
null資料點、與前一個值相同的資料點、或者有特定值的資料點。Buffered Iterator(緩衝迭代器):該迭代器提供將一個資料點”unread”(未讀)並且返回緩衝區的能力,以便下次讀取它。這被廣泛用於為視窗提供前瞻。
Reduce Iterator(reduce迭代器):該迭代器為視窗中的每一個資料點調用reduction函數。當視窗內的所有運算完成後,該視窗的所有資料點會被輸出。這用於簡單彙總函式,例如
COUNT()。Reduce Slice Iterator(reduce slice迭代器):該迭代器首先收集視窗內的所有資料點,然後立刻將它們全部傳送到一個reduction函數。結果從迭代器返回。這用於彙總函式,例如
DERIVATIVE()。Transform Iterator(轉換迭代器):該迭代器對輸入迭代器中的每個資料點調用轉換函式。這用於執行二進位運算式。
Dedupe Iterator(去重迭代器)該迭代器只輸出不同的資料點。因為該迭代器非常消耗資源,所以它只用於小查詢,例如元查詢語句(meta query statements)。
調用迭代器
InfluxQL中的函數調用分兩個層級(level)實現:shard層級和引擎層級。
為了提高效率,有些調用可以在多個層被封裝,例如,COUNT()可以在shard層級執行,然後一個CountIterator可以封裝多個CountIterator來計算所有shard的個數。這些迭代器可以使用NewCallIterator()來建立。
有些迭代器更複雜或者需要在更高的層級實現。例如,DERIVATIVE()首先需要獲得視窗內的所有資料點,然後再執行計算,該迭代器由引擎本身建立,並且永遠不會由更低層級建立。
InfluxDB® is a trademark registered by InfluxData, which is not affiliated with, and does not endorse, TSDB for InfluxDB®.