查询系统数据
InfluxDB Clustered 将与查询、表、分区和压缩相关的数据存储在集群内的系统表中。系统表包含 InfluxDB Clustered 内部监控系统使用和生成的时间序列数据。您可以查询集群系统表以获取有关集群的信息。
可能影响集群性能
查询 InfluxDB 3 系统表可能会影响 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 3 系统表可能会影响 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 Queriers 的数据。数据来自目录,并且由于所有 queriers 共享一个目录,因此无论您连接到哪个 querier,这三个表的结果都来自相同的数据源。
但是,system.queries
表是不同的 - 数据是每个 Querier 本地的。system.queries
包含针对您查询路由到的当前 querier 运行的查询的非持久化日志。查询日志特定于当前 Querier,并且不在集群中的 queriers 之间共享。日志的作用域限定为指定的数据库。
system.queries
system.queries
表存储为当前处理查询的节点上提供的命名空间(数据库)执行的查询的日志条目。system.queries
反映了进程本地、内存中、命名空间作用域的查询日志。
虽然此表可能对调试和监控查询很有用,但请记住以下几点:
- 存储在
system.queries
中的记录是瞬态且易失的- InfluxDB 在 pod 重启期间删除
system.queries
记录。 - 一个命名空间的查询可能会从另一个命名空间中逐出记录。
- InfluxDB 在 pod 重启期间删除
- 数据反映了特定 pod 回答命名空间查询的状态。
- 数据不在集群中的 queriers 之间共享。
- 对
system.queries
中记录的查询可能会返回不同的结果,具体取决于请求路由到的 pod。
在列出命名空间中可用的 measurements(表)时,某些客户端和查询工具可能会在命名空间表的列表中包含 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'
存储使用情况
查看特定表的大小(MB)
SELECT
SUM(total_size_mb) AS total_size_mb
FROM
system.partitions
WHERE
table_name = 'TABLE_NAME'
查看每个表的大小(MB)
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'
此页是否对您有帮助?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一份子!我们欢迎并鼓励您提供有关 InfluxDB Clustered 和本文档的反馈和错误报告。要获得支持,请使用以下资源:
拥有年度或支持合同的客户可以联系 InfluxData 支持。