查询系统数据
InfluxDB 集群存储与查询、表、分区和压缩相关的数据在集群内的系统表中。系统表包含由 InfluxDB 集群内部监控系统使用和生成的时间序列数据。您可以查询集群系统表以获取有关您集群的信息。
可能会影响集群性能
查询 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查询。
以以下任一种方式传递查询:
- a string on the command line
- a path to a file that contains the query
- a single dash (
-) to read the query from 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:
| 表名 | 分区键 | 分区ID |
|---|---|---|
| 天气 | 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 的数据。数据来自目录,由于所有查询器共享一个目录,因此这三个表的结果源于相同的数据, 无论您连接的是哪个查询器。
然而,system.queries 表是不同的——数据是本地于每个查询者的。system.queries 包含一个非持久化的查询日志,用于记录当前路由到您的查询的查询。查询日志特定于当前查询者,并且不会在您的集群中的查询者之间共享。日志的范围限定于指定的数据库。
系统.查询
该 system.queries 表存储在 当前处理查询 的节点上执行的针对提供的命名空间(数据库)的查询日志条目。system.queries 反映了一个进程本地的、内存中的、按照命名空间范围的查询日志。
虽然这个表对于调试和监控查询可能很有用,但请记住以下几点:
- 存储在
system.queries中的记录是短暂的和易变的- InfluxDB 在 pod 重启期间删除
system.queries记录。 - 一个命名空间的查询可以驱逐另一个命名空间的记录。
- InfluxDB 在 pod 重启期间删除
- 数据反映了特定 pod 在命名空间中回答查询的状态。
- 数据不会在您集群中的查询者之间共享。
- 针对
system.queries中记录的查询可能会返回不同的结果,具体取决于请求被路由到的 pod。
当列出命名空间中可用的测量(表)时,一些客户端和查询工具可能会将 queries 表包含在命名空间表的列表中。
系统.表
该 system.tables 表包含关于指定数据库中表的信息。
系统.分区
表 system.partitions 包含与指定数据库相关的分区信息。
系统.压缩器
该 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'