MySQL 查询编辑器
Grafana 的查询编辑器对于每个数据源都是独一无二的。有关 Grafana 查询编辑器的通用信息,请参阅查询编辑器。有关在 Grafana 中查询数据源的通用信息,请参阅查询和转换数据。
MySQL 查询编辑器位于Explore 页面上。您也可以从仪表盘面板访问 MySQL 查询编辑器。点击面板右上角的省略号,然后选择 编辑。
注意
如果在数据源配置页面或通过配置 provisioning 文件设置了默认数据库,则用户将只能查询该预配置的数据库。此功能位于一个功能标志后面,在启用
sqlDatasourceDatabaseSelection
后可用。
MySQL 查询编辑器组件
MySQL 查询编辑器有两种模式:Builder 和 Code。
Builder 模式可帮助您使用可视化界面构建查询。Code 模式支持高级查询并提供了复杂 SQL 查询编写支持。
注意
如果您的表名或数据库名包含保留字或禁用字符,编辑器将在名称周围加上引号。例如,名称
table-name
将用反引号括起来 -`table-name`
。
MySQL Builder 模式

以下组件将帮助您构建 MySQL 查询
格式 - 从下拉列表中选择 MySQL 查询的格式响应。默认是 表格。如果您使用 时序 格式选项,其中一列必须是
time
。数据集 - 从下拉列表中选择要查询的数据库。
表格 - 从下拉列表中选择一个表。表对应于所选的数据库。
数据操作 - 可选 从下拉列表中选择一个聚合。您可以点击 + 号 添加多个数据操作。点击 X 删除一个数据操作。点击 垃圾桶图标 删除整列。
列 - 选择要在其上运行聚合的列。
别名 - 可选 从下拉列表中添加一个别名。您也可以通过在框中输入并点击 Enter 添加自己的别名。通过点击 X 删除别名。
过滤器 - 切换以添加过滤器。
- 按列值过滤 - 可选 如果您切换 过滤器,您可以从下拉列表中添加要过滤的列。要过滤更多列,点击条件下拉列表右侧的 + 号。您可以从条件旁边的下拉列表中选择各种运算符。添加多个过滤器时,您可以添加一个
AND
运算符以显示所有真条件,或添加一个OR
运算符以显示任何真条件。使用第二个下拉列表选择一个过滤器。要移除过滤器,点击该过滤器的下拉列表旁边的X
按钮。选择日期类型列后,您可以从运算符列表中选择 宏 并选择timeFilter
,这将添加$__timeFilter
宏到使用选定日期列的查询中。
- 按列值过滤 - 可选 如果您切换 过滤器,您可以从下拉列表中添加要过滤的列。要过滤更多列,点击条件下拉列表右侧的 + 号。您可以从条件旁边的下拉列表中选择各种运算符。添加多个过滤器时,您可以添加一个
分组 - 切换以添加 按列分组。
- 按列分组 - 从下拉列表中选择要过滤的列。点击 + 号 按多个列过滤。点击 X 移除过滤器。
排序 - 切换以添加 ORDER BY 语句。
- 排序依据 - 从下拉列表中选择要排序的列。选择升序(
ASC
)或降序(DESC
)顺序。 - 限制 - 您可以为检索结果的数量添加一个可选限制。默认值为 50。
- 排序依据 - 从下拉列表中选择要排序的列。选择升序(
预览 - 切换以预览查询构建器生成的 SQL 查询。预览功能默认开启。
MySQL Code 模式
要创建高级查询,切换到 Code 模式,点击编辑器窗口右上角的 Code。Code 模式支持表、列、SQL 关键字、标准 SQL 函数、Grafana 模板变量和 Grafana 宏的自动补全。在指定表之前,列无法自动补全。

选择 表格 或 时序 作为格式。点击右下角的 {} 以格式化查询。点击向下箭头展开 Code 模式编辑器。CTRL/CMD + Enter 可作为执行查询的键盘快捷键。
警告
在 Code 模式下对查询所做的更改不会转移到 Builder 模式,并将被丢弃。系统将提示您将代码复制到剪贴板以保存任何更改。
宏
您可以将宏添加到查询中,以简化语法并启用动态元素,例如日期范围过滤器。
宏示例 | 描述 |
---|---|
$__time(dateColumn) | 将值替换为一个表达式,用于转换为 UNIX 时间戳并将列重命名为 time_sec 。示例:UNIX_TIMESTAMP(dateColumn) AS time_sec。 |
$__timeEpoch(dateColumn) | 将值替换为一个表达式,用于转换为 UNIX Epoch 时间戳并将列重命名为 time_sec 。示例:UNIX_TIMESTAMP(dateColumn) AS time_sec。 |
$__timeFilter(dateColumn) | 使用指定的列名将值替换为时间范围过滤器。示例:dateColumn BETWEEN FROM_UNIXTIME(1494410783) AND FROM_UNIXTIME(1494410983) |
$__timeFrom() | 将值替换为当前活动时间选择的开始时间。示例:FROM_UNIXTIME(1494410783) |
$__timeTo() | 将值替换为当前活动时间选择的结束时间。示例:FROM_UNIXTIME(1494410983) |
$__timeGroup(dateColumn,'5m') | 将值替换为适合在 GROUP BY 子句中使用的表达式。示例:*cast(cast(UNIX_TIMESTAMP(dateColumn)/(300) as signed)*300 as signed),* |
$__timeGroup(dateColumn,'5m', 0) | 与 $__timeGroup(dateColumn,'5m') 宏相同,但包含一个填充参数,以确保 Grafana 添加序列中的缺失点,使用 0 作为默认值。这仅适用于时序查询。 |
$__timeGroup(dateColumn,'5m', NULL) | 与 $__timeGroup(dateColumn,'5m', 0) 相同,但使用 NULL 作为缺失点的值。这仅适用于时序查询。 |
$__timeGroup(dateColumn,'5m', previous) | 与 $__timeGroup(dateColumn,'5m', previous) 宏相同,但使用序列中的上一个值作为填充值。如果不存在上一个值,则使用NULL 。这仅适用于时序查询。 |
$__timeGroupAlias(dateColumn,'5m') | 将值替换为与 $__timeGroup 相同的内容,但增加了一个列别名。 |
$__unixEpochFilter(dateColumn) | 使用指定的列名将值替换为时间范围过滤器,时间表示为 UNIX 时间戳。示例:dateColumn > 1494410783 AND dateColumn < 1494497183 |
$__unixEpochFrom() | 将值替换为当前活动时间选择的开始时间,以 UNIX 时间戳表示。示例:1494410783 |
$__unixEpochTo() | 将值替换为当前活动时间选择的结束时间,以 UNIX 时间戳表示。示例:1494497183 |
$__unixEpochNanoFilter(dateColumn) | 使用指定的列名将值替换为时间范围过滤器,时间表示为纳秒时间戳。示例:dateColumn > 1494410783152415214 AND dateColumn < 1494497183142514872 |
$__unixEpochNanoFrom() | 将值替换为当前活动时间选择的开始时间,以纳秒时间戳表示。示例:1494410783152415214 |
$__unixEpochNanoTo() | 将值替换为当前活动时间选择的结束时间,以纳秒时间戳表示。示例:1494497183142514872 |
$__unixEpochGroup(dateColumn,'5m', [fillmode]) | 与 $__timeGroup 相同,但适用于存储为 Unix 时间戳的时间。请注意,fillMode 仅适用于时序查询。 |
$__unixEpochGroupAlias(dateColumn,'5m', [fillmode]) | 与 $__timeGroup 相同,但同时也添加了列别名。请注意,fillMode 仅适用于时序查询。 |
表格 SQL 查询
如果 格式 选项设置为 表格,您可以执行几乎任何类型的 SQL 查询。表格面板将自动显示查询结果中的列和行。
您可以使用 SQL 关键字 AS
语法更改或自定义表格面板列的名称。
SELECT
title as 'Title',
user.login as 'Created By' ,
dashboard.created as 'Created On'
FROM dashboard
INNER JOIN user on user.id = dashboard.created_by
WHERE $__timeFilter(dashboard.created)
表格面板结果
时序查询
将 格式 选项设置为 时序 以创建和运行时序查询。
注意
要运行时序查询,您必须包含一个名为
time
的列,该列返回 SQL datetime 值或表示 UNIX epoch 时间(秒)的数值数据类型。此外,查询结果必须按time
列排序,以便在面板中正确可视化。
本节中的示例参考以下表格中的数据
+---------------------+--------------+---------------------+----------+
| time_date_time | value_double | CreatedAt | hostname |
+---------------------+--------------+---------------------+----------+
| 2020-01-02 03:05:00 | 3.0 | 2020-01-02 03:05:00 | 10.0.1.1 |
| 2020-01-02 03:06:00 | 4.0 | 2020-01-02 03:06:00 | 10.0.1.2 |
| 2020-01-02 03:10:00 | 6.0 | 2020-01-02 03:10:00 | 10.0.1.1 |
| 2020-01-02 03:11:00 | 7.0 | 2020-01-02 03:11:00 | 10.0.1.2 |
| 2020-01-02 03:20:00 | 5.0 | 2020-01-02 03:20:00 | 10.0.1.2 |
+---------------------+--------------+---------------------+----------+
时序查询结果以宽格式数据帧返回。除 time 或类型为 string 的任何列都会转换为数据帧查询结果中的值字段。任何 string 列都会转换为数据帧查询结果中的字段标签。
注意
为了向后兼容,上述规则有一个例外,适用于返回三列的查询,其中包括一个名为
metric
的字符串列。此列不转换为字段标签,而是用作字段名,并且序列名设置为该 metric 列的值。参考以下包含 metric 列的示例。
包含 metric
列的示例
SELECT
$__timeGroupAlias(time_date_time,'5m'),
min(value_double),
'min' as metric
FROM test_data
WHERE $__timeFilter(time_date_time)
GROUP BY time
ORDER BY time
数据帧结果
+---------------------+-----------------+
| Name: time | Name: min |
| Labels: | Labels: |
| Type: []time.Time | Type: []float64 |
+---------------------+-----------------+
| 2020-01-02 03:05:00 | 3 |
| 2020-01-02 03:10:00 | 6 |
| 2020-01-02 03:20:00 | 5 |
+---------------------+-----------------+
要自定义默认序列名称格式(可选),请参阅标准选项定义。
使用 $__timeGroupAlias 宏中的 fill 参数将 null 值转换为零的示例
SELECT
$__timeGroupAlias(createdAt,'5m',0),
sum(value_double) as value,
hostname
FROM test_data
WHERE
$__timeFilter(createdAt)
GROUP BY time, hostname
ORDER BY time
给定以下示例中的数据帧结果并使用图面板,您将获得两个序列,分别命名为 value 10.0.1.1 和 value 10.0.1.2。要以 10.0.1.1 和 10.0.1.2 的名称渲染序列,请使用标准选项定义 的显示值 ${__field.labels.hostname}
。
数据帧结果
+---------------------+---------------------------+---------------------------+
| Name: time | Name: value | Name: value |
| Labels: | Labels: hostname=10.0.1.1 | Labels: hostname=10.0.1.2 |
| Type: []time.Time | Type: []float64 | Type: []float64 |
+---------------------+---------------------------+---------------------------+
| 2020-01-02 03:05:00 | 3 | 4 |
| 2020-01-02 03:10:00 | 6 | 7 |
| 2020-01-02 03:15:00 | 0 | 0 |
| 2020-01-02 03:20:00 | 0 | 5 |
+---------------------+---------------------------+---------------------------+
包含多列的示例
SELECT
$__timeGroupAlias(time_date_time,'5m'),
min(value_double) as min_value,
max(value_double) as max_value
FROM test_data
WHERE $__timeFilter(time_date_time)
GROUP BY time
ORDER BY time
数据帧结果
+---------------------+-----------------+-----------------+
| Name: time | Name: min_value | Name: max_value |
| Labels: | Labels: | Labels: |
| Type: []time.Time | Type: []float64 | Type: []float64 |
+---------------------+-----------------+-----------------+
| 2020-01-02 03:05:00 | 3 | 4 |
| 2020-01-02 03:10:00 | 6 | 7 |
| 2020-01-02 03:20:00 | 5 | 5 |
+---------------------+-----------------+-----------------+
模板化
您可以利用变量,而无需在指标查询中硬编码服务器、应用或传感器名称等值。变量在仪表盘顶部显示为下拉选择框。这些下拉框使您可以轻松更改仪表盘中显示的数据。
请参阅模板,了解创建模板变量以及不同类型的介绍。
查询变量
如果添加一个 Query
模板变量,您可以编写一个 MySQL 查询来检索测量名称、键名或键值等项,这些项将显示在下拉菜单中。
例如,您可以使用变量通过在模板变量的 Query 设置中创建以下查询,从表中检索 hostname
列的所有值。
SELECT hostname FROM my_host
一个查询可以返回多列,Grafana 将根据查询结果自动生成一个列表。例如,以下查询返回一个包含 hostname
和 hostname2
的值的列表。
SELECT my_host.hostname, my_other_host.hostname2 FROM my_host JOIN my_other_host ON my_host.city = my_other_host.city
要在查询中使用时间范围相关的宏,例如 $__timeFilter(column)
,您必须将模板变量的刷新模式设置为 时间范围改变时更新。
SELECT event_name FROM event_log WHERE $__timeFilter(time_column)
另一种选择是创建键/值变量的查询。查询应返回两列,分别命名为 __text
和 __value
。__text
列必须包含唯一值(否则只使用第一个值)。这使得下拉选项能够将一个文本友好的名称显示为文本,同时使用一个 ID 作为值。例如,查询可以使用 hostname
作为文本,id
作为值
SELECT hostname AS __text, id AS __value FROM my_host
您还可以创建嵌套变量。例如,如果您有一个名为 region
的变量,您可以配置 hosts
变量以仅显示当前所选区域内的主机,如下例所示。如果 region
是一个多值变量,请使用 IN
运算符而不是 =
来匹配多个值。
SELECT hostname FROM my_host WHERE region IN($region)
使用 __searchFilter
在查询变量中过滤结果
在查询字段中使用 __searchFilter
允许根据用户在下拉选择框中的输入来过滤查询结果。如果您不输入任何内容,__searchFilter
的默认值是 %。
请注意,您必须将 __searchFilter
表达式用引号括起来,因为 Grafana 不会自动添加它们。
以下示例演示了如何在查询字段中使用 __searchFilter
,以便用户在下拉选择框中输入时能够实时搜索 hostname
。
SELECT hostname FROM my_host WHERE hostname LIKE '$__searchFilter'
在查询中使用变量
模板变量值仅在模板变量是 multi-value
时才加引号。
如果变量是多值变量,使用 IN
比较运算符而不是 =
来匹配多个值。
您可以使用两种不同的语法
$<varname>
示例,模板变量名为 hostname
SELECT
UNIX_TIMESTAMP(atimestamp) as time,
aint as value,
avarchar as metric
FROM my_table
WHERE $__timeFilter(atimestamp) and hostname in($hostname)
ORDER BY atimestamp ASC
[[varname]]
示例,模板变量名为 hostname
SELECT
UNIX_TIMESTAMP(atimestamp) as time,
aint as value,
avarchar as metric
FROM my_table
WHERE $__timeFilter(atimestamp) and hostname in([[hostname]])
ORDER BY atimestamp ASC
禁用多值变量的引号
Grafana 会自动为多值变量创建带引号的逗号分隔字符串。例如:如果选择了 server01
和 server02
,它将被格式化为:'server01', 'server02'
。要禁用引号,请对变量使用 csv 格式选项
Grafana 会自动将多值变量格式化为带引号的逗号分隔字符串。例如,如果选择了 server01
和 server02
,它们将被格式化为 'server01', 'server02'
。要移除引号,请为变量启用 CSV 格式选项。
${servers:csv}
阅读有关变量格式选项的更多信息,请参阅变量 文档。
注解
注解 允许您在图表上叠加丰富的事件信息。您可以通过 仪表盘设置 > 注解视图 添加注解查询。
使用包含time
列(包含 epoch 值)的查询示例
SELECT
epoch_time as time,
metric1 as text,
CONCAT(tag1, ',', tag2) as tags
FROM
public.test_data
WHERE
$__unixEpochFilter(epoch_time)
使用包含 time
和 timeend
列(包含 epoch 值)的区域查询示例
SELECT
epoch_time as time,
epoch_timeend as timeend,
metric1 as text,
CONCAT(tag1, ',', tag2) as tags
FROM
public.test_data
WHERE
$__unixEpochFilter(epoch_time)
使用包含 time
列(包含原生 SQL 日期/时间数据类型)的查询示例
SELECT
native_date_time as time,
metric1 as text,
CONCAT(tag1, ',', tag2) as tags
FROM
public.test_data
WHERE
$__timeFilter(native_date_time)
名称 | 描述 |
---|---|
time | 日期/时间字段的名称,可以是包含原生 SQL 日期/时间数据类型或 epoch 值的列。 |
timeend | 可选的结束日期/时间字段名称,可以是包含原生 SQL 日期/时间数据类型或 epoch 值的列。 |
text | 事件描述字段。 |
tags | 可选的字段名称,用于将事件标签作为逗号分隔字符串。 |
告警
使用时序查询创建告警。告警规则条件尚不支持表格格式的查询。
有关告警的更多信息,请参阅以下内容