文档资料

查询系统数据

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.tablessystem.partitionssystem.compactor表时,使用WHERE子句按table_name进行过滤。

SELECT * FROM system.partitions WHERE table_name = '
TABLE_NAME
'
按分区键过滤

当查询system.partitionssystem.compactor表时,使用WHERE子句按partition_key进行过滤。

SELECT * FROM system.partitions WHERE partition_key = '
PARTITION_KEY
'

为了进一步提高性能,使用ANDpartition_keytable_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.partitionssystem.compactor表时,使用WHERE子句按partition_id进行过滤。

SELECT * FROM system.partitions WHERE partition_id = 
PARTITION_ID

为了实现最优化,使用ANDpartition_idtable_name配对——例如

SELECT * 
FROM system.partitions 
WHERE
  table_name = '
TABLE_NAME
'
AND partition_id =
PARTITION_ID
;

尽管您不需要将partition_idtable_name配对(因为分区ID在集群中是唯一的),但这是最优化的方法,尤其是当您在数据库中有许多表时

检索分区ID

要检索分区ID,查询system.partitions以获取table_namepartition_key对——例如

SELECT
  table_name,
  partition_key,
  partition_id 
FROM system.partitions
WHERE
  table_name = '
TABLE_NAME
'
AND partition_key = '
PARTITION_KEY
'
;

结果包含partition_id

table_namepartition_keypartition_id
weather43 | 2020-05-271362
结合过滤器以提高性能

使用ANDORIN关键字将查询中的过滤器组合。

  • 在过滤同一列中的不同值时使用ORIN条件——例如

    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.tablessystem.partitionssystem.compactor中的数据包括您集群中所有InfluxDB 查询器的数据。这些数据来自目录,由于所有查询器共享一个目录,因此这三个表的结果都源自相同的数据源,无论您连接到哪个查询器。

然而,system.queries表有所不同——数据是每个查询器本地的。在您查询的路由到的当前查询器上运行的查询中,system.queries包含了对当前查询器运行的查询的非持久日志。查询日志仅针对当前查询器,不会与您的集群中其他查询器共享。日志的范围限定在指定的数据库中。

system.queries

system.queries表存储了在提供命名空间(数据库)的节点上执行的查询的日志条目。在当前处理查询的节点上,system.queries反映了命名空间范围的过程局部、内存中的查询日志。

虽然此表可能对调试和监控查询很有用,但请注意以下事项

  • system.queries中存储的记录是短暂的和易变的
    • InfluxDB在pod重启期间会删除system.queries记录。
    • 一个命名空间的查询可能会驱逐另一个命名空间的记录。
  • 数据反映了特定pod回答该命名空间查询的状态。
    • 数据不会在您的集群中的查询器之间共享。
    • system.queries中的记录的查询可能会根据请求路由到的pod返回不同的结果。

查看system.queries模式

在列出命名空间内的可用度量(表)时,一些客户端和查询工具可能将queries表包含在命名空间表的列表中。

system.tables

system.tables表包含指定数据库中表的详细信息。

查看system.tables模式

system.partitions

system.partitions表包含与指定数据库关联的分区信息。

查看system.partitions模式

system.compactor

system.compactor表包含与指定数据库关联的压缩分区Parquet文件的信息。

查看system.compactor模式

系统查询示例

可能影响集群性能

查询InfluxDB v3系统表可能会影响您InfluxDB集群的写入和查询性能。

本节中的示例包括优化查询并减少对集群的影响WHERE过滤器。

以下示例中,将 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
'

这个页面有帮助吗?

感谢您的反馈!


Flux的未来

Flux将进入维护模式。您可以继续像现在一样使用它,无需更改代码。

阅读更多

InfluxDB v3增强功能和InfluxDB Clustered现已上市

新功能包括更快的查询性能和管理工具,推动了InfluxDB v3产品线的进步。InfluxDB Clustered现已上市。

InfluxDB v3性能和功能

InfluxDB v3产品线在查询性能方面取得了显著提升,并提供了新的管理工具。这些增强功能包括一个操作仪表板来监控您的InfluxDB集群的健康状况,InfluxDB Cloud Dedicated中的单点登录(SSO)支持,以及用于令牌和数据库的新管理API。

了解v3增强功能


InfluxDB Clustered上市

InfluxDB Clustered现已上市,为您提供了在自管理堆栈中使用InfluxDB v3的能力。

与我们谈谈InfluxDB Clustered