查询系统数据
InfluxDB 集群将查询、表、分区和压缩的数据存储在集群内的 系统表 中。系统表包含由 InfluxDB 集群内部监控系统使用和生成的时序数据。您可以通过查询集群系统表来获取有关集群的信息。
可能影响集群性能
查询 InfluxDB v3 系统表可能会影响您的 InfluxDB 集群的写入和查询性能。使用过滤器来 优化查询以减少对集群的影响。
系统表可能发生变化
系统表不是 InfluxDB 稳定 API 的一部分,并且可能随着新版本而更改。提供的模式信息和查询示例截至 2024年9月18日 是有效的。如果您检测到模式更改或查询示例不工作,请 提交问题。
查询系统表
使用 influxctl
查询系统表需要 influxctl
v2.8.0 或更高版本。
使用 influxctl query
命令 和 SQL 查询系统表。提供以下
使用带有命令标志
--enable-system-tables
的 启用系统表。数据库令牌:具有指定数据库读取权限的数据库令牌。使用数据库令牌设置,或
influxctl
连接配置文件中的token
设置,或使用--token
命令行标志。数据库名:要查询信息的数据库名。使用
influxctl
连接配置文件中的database
设置,或使用--database
命令行标志。SQL查询:要执行的SQL查询。
以下方式之一传递查询
- 命令行上的字符串
- 包含查询的文件的路径
- 单个短横线(
-
)从stdin读取查询
influxctl query \
--enable-system-tables \
--database DATABASE_NAME \
--token DATABASE_TOKEN \
"SQL_QUERY"
influxctl query \
--enable-system-tables \
--database DATABASE_NAME \
--token DATABASE_TOKEN \
/path/to/query.sql
cat ./query.sql | influxctl query \
--enable-system-tables \
--database DATABASE_NAME \
--token DATABASE_TOKEN \
-
替换以下内容
DATABASE_TOKEN
:具有对指定数据库读取访问权限的数据库令牌DATABASE_NAME
:要查询信息的数据库名。SQL_QUERY
:要执行的SQL查询。有关示例,请参阅系统查询示例。
当提示时,输入y
以确认查询系统表可能对您的集群产生的影响。
优化查询以减少对集群的影响
查询InfluxDB v3系统表可能会影响InfluxDB集群的性能。随着您向集群写入数据,分区和Parquet文件的数量可能会增加到影响系统表性能的程度。在文件和分区较少的情况下,查询可能只需几毫秒,但随着文件和分区的增加,可能需要10秒或更长时间。
使用以下过滤器优化您的系统表查询并减少对集群性能的影响。
在您的查询中替换以下内容
TABLE_NAME
:检索分区的表PARTITION_ID
:一个分区ID(int64)PARTITION_KEY
:从表的分区模板派生出的分区键。默认格式为%Y-%m-%d
(例如,2024-01-01
)。
按表名过滤
当查询system.tables
、system.partitions
或system.compactor
表时,使用WHERE
子句按table_name
进行过滤。
SELECT * FROM system.partitions WHERE table_name = 'TABLE_NAME'
按分区键过滤
当查询system.partitions
或system.compactor
表时,使用WHERE
子句按partition_key
进行过滤。
SELECT * FROM system.partitions WHERE partition_key = 'PARTITION_KEY'
为了进一步提高性能,使用AND
将partition_key
与table_name
配对——例如
SELECT *
FROM system.partitions
WHERE
table_name = 'TABLE_NAME'
AND partition_key = 'PARTITION_KEY';
SELECT *
FROM system.compactor
WHERE
table_name = 'TABLE_NAME'
AND partition_key = 'PARTITION_KEY';
按分区ID过滤
当查询system.partitions
或system.compactor
表时,使用WHERE
子句按partition_id
进行过滤。
SELECT * FROM system.partitions WHERE partition_id = PARTITION_ID
为了实现最优化,使用AND
将partition_id
与table_name
配对——例如
SELECT *
FROM system.partitions
WHERE
table_name = 'TABLE_NAME'
AND partition_id = PARTITION_ID;
尽管您不需要将partition_id
与table_name
配对(因为分区ID在集群中是唯一的),但这是最优化的方法,尤其是当您在数据库中有许多表时。
检索分区ID
要检索分区ID,查询system.partitions
以获取table_name
和partition_key
对——例如
SELECT
table_name,
partition_key,
partition_id
FROM system.partitions
WHERE
table_name = 'TABLE_NAME'
AND partition_key = 'PARTITION_KEY';
结果包含partition_id
table_name | partition_key | partition_id |
---|---|---|
weather | 43 | 2020-05-27 | 1362 |
结合过滤器以提高性能
使用AND
、OR
或IN
关键字将查询中的过滤器组合。
在过滤同一列中的不同值时使用
OR
或IN
条件——例如WHERE partition_id = 1 OR partition_id = 2
使用
IN
可以使多个OR
条件更易于阅读——例如WHERE table_name IN ('foo', 'bar', 'baz')
避免在
OR
条件中混合不同的列,因为这不会提高性能——例如WHERE table_name = 'foo' OR partition_id = 2 -- This will not improve performance
系统表
系统表可能会发生变化。
理解系统表数据分布
system.tables
、system.partitions
和system.compactor
中的数据包括您集群中所有InfluxDB 查询器的数据。这些数据来自目录,由于所有查询器共享一个目录,因此这三个表的结果都源自相同的数据源,无论您连接到哪个查询器。
然而,system.queries
表有所不同——数据是每个查询器本地的。在您查询的路由到的当前查询器上运行的查询中,system.queries
包含了对当前查询器运行的查询的非持久日志。查询日志仅针对当前查询器,不会与您的集群中其他查询器共享。日志的范围限定在指定的数据库中。
system.queries
system.queries
表存储了在提供命名空间(数据库)的节点上执行的查询的日志条目。在当前处理查询的节点上,system.queries
反映了命名空间范围的过程局部、内存中的查询日志。
虽然此表可能对调试和监控查询很有用,但请注意以下事项
system.queries
中存储的记录是短暂的和易变的- InfluxDB在pod重启期间会删除
system.queries
记录。 - 一个命名空间的查询可能会驱逐另一个命名空间的记录。
- InfluxDB在pod重启期间会删除
- 数据反映了特定pod回答该命名空间查询的状态。
- 数据不会在您的集群中的查询器之间共享。
- 对
system.queries
中的记录的查询可能会根据请求路由到的pod返回不同的结果。
在列出命名空间内的可用度量(表)时,一些客户端和查询工具可能将queries
表包含在命名空间表的列表中。
system.tables
system.tables
表包含指定数据库中表的详细信息。
system.partitions
system.partitions
表包含与指定数据库关联的分区信息。
system.compactor
system.compactor
表包含与指定数据库关联的压缩分区Parquet文件的信息。
系统查询示例
以下示例中,将 TABLE_NAME
替换为您想要查询信息的表名。
查询日志
查看所有存储的查询日志
SELECT * FROM system.queries
查看超过阈值的端到端持续时间查询的查询日志
以下返回持续时间大于50毫秒的查询日志。
SELECT *
FROM
system.queries
WHERE
end2end_duration::BIGINT > (50 * 1000000)
查看特定时间间隔内的特定查询的查询日志
SELECT *
FROM system.queries
WHERE issue_time >= now() - INTERVAL '1 day'
AND query_text LIKE '%select * from home%'
from influxdb_client_3 import InfluxDBClient3
client = InfluxDBClient3(token = DATABASE_TOKEN,
host = HOSTNAME,
org = '',
database=DATABASE_NAME)
client.query('select * from home')
reader = client.query('''
SELECT *
FROM system.queries
WHERE issue_time >= now() - INTERVAL '1 day'
AND query_text LIKE '%select * from home%'
''',
language='sql',
headers=[(b"iox-debug", b"true")],
mode="reader")
分区
查看特定表的分区模板
SELECT *
FROM
system.tables
WHERE
table_name = 'TABLE_NAME'
查看表的全部分区
SELECT *
FROM
system.partitions
WHERE
table_name = 'TABLE_NAME'
查看每个表的分区数量
SELECT
table_name,
COUNT(*) AS partition_count
FROM
system.partitions
WHERE
table_name IN ('foo', 'bar', 'baz')
GROUP BY
table_name
查看特定表的分区数量
SELECT
COUNT(*) AS partition_count
FROM
system.partitions
WHERE
table_name = 'TABLE_NAME'
存储使用情况
查看特定表的兆字节大小
SELECT
SUM(total_size_mb) AS total_size_mb
FROM
system.partitions
WHERE
table_name = 'TABLE_NAME'
查看每个表的兆字节大小
SELECT
table_name,
SUM(total_size_mb) AS total_size_mb
FROM
system.partitions
WHERE
table_name IN ('foo', 'bar', 'baz')
GROUP BY
table_name
查看每个表的压缩分区总字节数
SELECT
table_name,
SUM(total_l0_bytes) + SUM(total_l1_bytes) + SUM(total_l2_bytes) AS total_bytes
FROM
system.compactor
WHERE
table_name IN ('foo', 'bar', 'baz')
GROUP BY
table_name
查看特定表的压缩分区总字节数
SELECT
SUM(total_l0_bytes) + SUM(total_l1_bytes) + SUM(total_l2_bytes) AS total_bytes
FROM
system.compactor
WHERE
table_name = 'TABLE_NAME'
压缩
查看每个表的压缩总数
SELECT
table_name,
SUM(total_l0_files) AS total_l0_files,
SUM(total_l1_files) AS total_l1_files,
SUM(total_l2_files) AS total_l2_files,
SUM(total_l0_bytes) AS total_l0_bytes,
SUM(total_l1_bytes) AS total_l1_bytes,
SUM(total_l2_bytes) AS total_l2_bytes
FROM
system.compactor
WHERE
table_name IN ('foo', 'bar', 'baz')
GROUP BY
table_name
查看特定表的压缩总数
SELECT
SUM(total_l0_files) AS total_l0_files,
SUM(total_l1_files) AS total_l1_files,
SUM(total_l2_files) AS total_l2_files,
SUM(total_l0_bytes) AS total_l0_bytes,
SUM(total_l1_bytes) AS total_l1_bytes,
SUM(total_l2_bytes) AS total_l2_bytes
FROM
system.compactor
WHERE
table_name = 'TABLE_NAME'
这个页面有帮助吗?
感谢您的反馈!