管理数据分区
当将数据写入 InfluxDB 集群时,InfluxDB 3 存储引擎以 Apache Parquet 格式在 对象存储 中存储数据。每个 Parquet 文件代表一个 分区——数据的逻辑分组。 默认情况下,InfluxDB 按 天 对每个表进行分区。如果这个默认策略导致单系列查询性能不佳,您可以通过指定标签值和不同的时间间隔来定义自定义分区策略,以优化特定架构和工作负载的查询性能。
何时考虑自定义分区
如果考虑自定义分区:
优点
自定义分区的主要优点是它允许您自定义存储结构,以改善特定于您的模式和工作负载的查询性能。
- 针对特定类型查询优化存储以提高性能。例如,如果查询经常选择具有特定标签值的数据,您可以通过该标签进行分区,以提高这些查询的性能。
- 针对特定类型数据的优化存储。例如,如果您存储的数据是稀疏的,并且您查询的时间范围通常大于一天,您可以按月而不是按天对数据进行分区。
缺点
使用自定义分区可能会增加其他部分的 InfluxDB 3 存储引擎的负载, 但您可以单独扩展每个部分以应对增加的负载。
这些缺点的权重取决于标签的基数和用于分区的时间间隔的特异性。
- 对Ingester的负载增加 因为它将数据分成更小的分区和文件。
- 增加了对目录的负载 因为存储和查询了更多对分区Parquet文件位置的引用。
- 增加了对压实机的负载,因为它需要压实更多的分区Parquet文件。
- 与对象存储相关的增加成本,随着更多分区的Parquet文件被创建和存储。
- 增加的延迟。InfluxDB 处理查询并返回结果所需的时间与表的总分区数线性增加,尽管只是略微增加。
- 在WHERE子句中未使用标签的查询性能下降的风险。 这些查询可能读取许多分区和较小的文件,这可能会降低性能。
限制
自定义分区有以下限制:
- 仅在创建时定义数据库和表的分区;之后无法更新分区策略。
- 在分区模板中包含时间部分。
- 您可以使用最多八个维度进行分区(七个标签和一个时间间隔)。
自定义分区计划
- 学习 分区是如何工作的
- 遵循 最佳实践 来定义分区和管理分区增长
- 为您的数据定义自定义分区
- 采取措施以限制分区文件的数量
分区是如何工作的
分区模板
分区模板定义了用于 分区键 的模式,并确定了 InfluxDB 按照时间间隔对数据进行分区的方式。分区模板使用标签值和 Rust strftime 日期和时间格式语法。
有关更详细的信息,请参见 Partition templates。
分区键
分区键唯一标识一个分区。分区模板 定义了分区键格式。分区键由最多8个维度组成(1个时间部分和最多7个标签或标签桶部分)。分区键使用分区键分隔符 (|) 来区分各个部分。
分区键的默认格式是 %Y-%m-%d(例如, 2024-01-01),这为每一天创建一个分区。
查询生命周期中的分区
查询数据时:
查询引擎能够更快地识别要读取哪些分区并从这些分区读取数据,查询性能就越高。
有关查询生命周期的更多信息,请参阅 InfluxDB 3 查询生命周期.
查询示例
考虑以下查询,它选择production表中的所有内容,其中line标签为A,并且station标签为cnc:
SELECT *
FROM production
WHERE
time >= now() - INTERVAL '1 week'
AND line = 'A'
AND station = 'cnc'
使用默认的分区策略(按天),查询引擎读取八个独立的分区(一个是今天的分区,另外七个是过去七天的分区):
- 2025-01-15
- 2025-01-14
- 2025-01-13
- 2025年1月12日
- 2025-01-11
- 2025-01-10
- 2025-01-09
- 2025-01-08
查询引擎必须扫描 所有 分区中的行以识别 line 为 A 且 station 为 cnc 的行。这一过程耗费了宝贵的时间,并导致查询性能下降。
然而,在您的分区策略中包含标签允许查询引擎识别仅包含所需标签值的分区。这避免了扫描标签值的行。
例如,如果您按 line、station 和天进行数据分区,虽然文件数量会增加,但查询引擎可以迅速识别并读取仅与查询相关的数据:
A | cnc | 2025-01-15
A | wld | 2025-01-15
B | cnc | 2025-01-15
B | wld | 2025-01-15
A | 数控 | 2025-01-14
A | wld | 2025-01-14
B | cnc | 2025-01-14
B | wld | 2025-01-14
A | cnc | 2025-01-13
A | wld | 2025-01-13
B | cnc | 2025-01-13
B | wld | 2025-01-13
A | cnc | 2025-01-12
A | wld | 2025-01-12
B | cnc | 2025年1月12日
B | wld | 2025-01-12
A | cnc | 2025-01-11
A | wld | 2025-01-11
B | cnc | 2025-01-11
B | wld | 2025-01-11
A | 数控 | 2025-01-10
A | wld | 2025-01-10
B | cnc | 2025-01-10
B | wld | 2025-01-10
A | cnc | 2025-01-09
A | wld | 2025-01-09
B | cnc | 2025-01-09
B | wld | 2025-01-09
A | cnc | 2025-01-08
A | wld | 2025-01-08
B | cnc | 2025-01-08
B | wld | 2025-01-08
分区指南
定义自定义分区
使用 influxctl CLI 在创建数据库或表时定义自定义分区策略。
使用分区模板
了解如何使用分区模板定义自定义分区策略。数据可以按标签和时间进行分区。
分区最佳实践
了解将自定义分区策略应用于存储在InfluxDB中的数据的最佳实践。
查看分区信息
从 InfluxDB 3 个系统表查询分区信息,以查看分区模板并验证分区是否按预期工作。
SELECT * FROM system.partitions WHERE table_name = 'example-table'