系统表第1部分:介绍和最佳实践

导航到

作为InfluxDB 云专用集群用户,您可能想检查您的集群以更好地了解您的数据库、表、分区和压缩状态。InfluxDB将这些重要元数据存储在系统表中(在第1节中描述),这些表有助于了解集群性能和维护决策。

1. 什么是系统表

系统表是“虚拟”表,它呈现特定数据库的元数据,并提供对数据库存储的洞察。每个系统表都限于特定数据库,并且是只读的,这意味着它不能被修改。

系统表默认隐藏,因为对这些表的高频访问可能会干扰数据库的持续操作。因此,查询系统表需要带有请求的特殊调试头。一旦添加了调试头(在第2节中描述),您就可以使用SQL查询系统表,就像查询InfluxDB中的任何其他表一样。

以下是InfluxDB提供的系统表

+---------------+--------------------+-------------+------------+
| table_catalog | table_schema       | table_name  | table_type |
+---------------+--------------------+-------------+------------+
| ...           | ...                | ...         | ...        |
| public        | system             | compactor   | BASE TABLE |
| public        | system             | partitions  | BASE TABLE |
| public        | system             | queries     | BASE TABLE |
| public        | system             | tables      | BASE TABLE |
| ...           | ...                | ...         | ...        |
+---------------+--------------------+-------------+------------+

在本博文中,我们将关注以下三个表

  • system.tables
  • system.partitions
  • system.compactor
描述 模式
system.tables 包含有关表的信息,例如特定数据库中的表名和分区模板 链接
system.partitions 包含有关分区、分区大小、文件计数等信息。 链接
system.compactor 包含不同压缩级别上压缩分区的详细信息。 链接

警告:系统表不是InfluxDB的稳定API的一部分。它们可能会更改,并且不保证兼容性。

警告:查询系统表可能会影响写入和查询性能。仅用于调试目的,并使用过滤器优化查询以最小化对集群的影响。

2. 访问系统表

要访问系统表,您必须在请求中提供调试头。添加此头的具体命令取决于您使用的客户端。

influxctl CLI

对于influxctl,设置--enable-system-tables

influxctl query \
  --enable-system-tables \
  --database DATABASE_NAME \
  --token DATABASE_TOKEN \
  "SQL_QUERY"

Arrow Flight SQL或其他客户端库

对于Arrow Flight SQL其他客户端库,例如Go和Python,设置iox-debug头为true

3. 查询系统表:示例

1. 查看特定表的分区模板

SELECT  *  FROM  system.tables  WHERE  table_name  =  'TABLE_NAME'

示例结果

+-----------------+--------------------------------------------------------+
| table_name      | partition_template                                     |
+-----------------+--------------------------------------------------------+
| your_table_name | {"parts":[{"timeFormat":"%Y-%m"},{"tagValue":"col1"}]} |
+-----------------+--------------------------------------------------------+

如果某个表在命令输出中不包含分区模板,则该表使用默认的(1天)分区策略,并且不按标签分区。

2. 查看每个表的分区数量和总大小

SELECT
  table_name,
  COUNT(*) AS partition_count,
  SUM(total_size_mb) AS total_size_mb
FROM system.partitions
WHERE table_name IN ('foo', 'bar', 'baz')
GROUP BY table_name

示例结果

+------------+-----------------+---------------+
| table_name | partition_count | total_size_mb |
+------------+-----------------+---------------+
| foo        | 1               | 2             |
| bar        | 4               | 5             |
| baz        | 10              | 23            |
+------------+-----------------+---------------+

3. 查看不同压缩文件级别的文件大小*

SELECT
  table_name,
  SUM(total_l0_files) AS l0_files,
  SUM(total_l1_files) AS l1_files,
  SUM(total_l2_files) AS l2_files,
  SUM(total_l0_bytes) AS l0_bytes,
  SUM(total_l1_bytes) AS l1_bytes,
  SUM(total_l2_bytes) AS l2_bytes
FROM system.compactor
WHERE table_name IN ('foo', 'bar', 'baz')
GROUP BY table_name

*压缩文件是经过压缩器处理的压缩 Parquet 文件,以优化存储。这些文件有不同的压缩级别:L0、L1 和 L2。L0,或“级别0”,代表新导入的未压缩的小文件,而 L2,或“级别2”,代表压缩的、不重叠的文件。

示例结果

+------------+----------+----------+----------+----------+----------+----------+
| table_name | l0_files | l1_files | l2_files | l0_bytes | l1_bytes | l2_bytes |
+------------+----------+----------+----------+----------+----------+----------+
| foo        | 0        | 1        | 0        | 0        | 20659    | 0        |
| bar        | 0        | 1        | 0        | 0        | 7215     | 0        |
| baz        | 0        | 1        | 0        | 0        | 10784    | 0        |
+------------+----------+----------+----------+----------+----------+----------+

4. 优化查询以减少集群影响

查询系统表可能会降低其他常见查询的性能,特别是如果您正在尝试查看包含数百个表、数十万个分区和数百万个Parquet 文件的集群中的每个细节。

为了减少性能影响,我们建议通过添加以下过滤器来选择特定表或特定分区的信息

WHERE table_name = '...'
WHERE table_name = '...' AND partition_key = '...'
WHERE table_name = '...' AND partition_id = ...
WHERE partition_id = ...

请参阅如何获取分区键分区ID的文档。

5. 使用最有效的过滤器

在上述过滤器中,以下过滤器经过特别优化,可以显著减少查询延迟到约 20 毫秒,即使在我们的最大集群中也是如此

WHERE table_name = '...' AND partition_key = '...'
WHERE table_name = '...' AND partition_id = ...

6. 总结

在这第一篇文章中,我们介绍了系统表,解释了如何访问它们,并讨论了如何使用过滤器优化查询。在下一篇文章中,我们将解释我们如何提高系统表性能。

参考