InfluxDB 3.0 中查询性能的数据分区
作者:Nga Tran / 开发者
2024年1月19日
导航至
查询性能在任何数据库中都至关重要。数据分区是一种帮助修剪不必要数据的机制,可以使查询更快地运行。然而,在大量和小量分区之间总是存在权衡。例如,在高度基数列上的细粒度分区可能会降低性能。本文介绍了 InfluxDB 3.0 支持的不同分区方案及其权衡。
只有 InfluxData 的 云专用 和 集群 产品支持用户定义分区。请注意,InfluxDB 云无服务器 总是按天分区,无法修改此设置。
默认分区
由于 InfluxDB 是一个时间序列数据库,它通过时间范围过滤大多数查询。如果您加载数据时没有指定如何对表进行分区,则默认情况下,InfluxDB 将按天对您的数据进行分区,如图 1 所示。它将同一天具有 time
的所有数据存储在同一分区中。在实践中,这对大多数 中等容量 用例来说是一个很好的分区方案,有助于平衡摄取效率和查询性能。
图 1:按天分区的 my_table 数据
只选择特定时间范围的查询只需要从相关分区中读取数据。例如,以下 SQL 查询只需要从两个分区中读取数据,2025-01-01
和 2025-01-02。
InfluxDB 3.0 使用其目录中的信息来避免读取任何其他分区。
SELECT ...
FROM my_table
WHERE time >= '2025-01-01 18:00:00' AND time <= '2025-01-02 03:00:00';
查询 1:按时间范围过滤数据
用户定义/自定义分区
对于单个日子包含过多数据(例如,GBs 的 Parquet 文件)且查询包括对其他标签列的过滤的情况,InfluxDB 允许您根据您的标签(s)和时间对数据进行分区。例如,如果您的常见查询需要特定时间范围内特定城市的特定数据,如下面的查询所示,您可以使用自定义分区来在 city_name
和 time
上对数据进行分区。
SELECT ...
FROM my_table
WHERE time >= '2025-01-01 18:00:00' AND time <= '2025-01-02 03:00:00'
AND city_name = `Boston`;
查询 2:按城市和时间范围过滤数据
如果您按 city_name
和 day
对数据进行分区,您将拥有 更多分区,它们将如下所示
图 2:按 city_name 和 day 分区的 my_table 数据
查询 2 只需要读取两个分区,Boston | 2025-01-01
和 Boston | 2025-01-02。
如果您的数据包含许多城市,每个分区将比默认的按天分区小,并且您将需要更少的查询数据。
请注意,您自定义的分区标签列必须始终具有值,以便InfluxDB能够将它们存储在正确的分区中。如果没有值,InfluxDB将没有足够的信息来应用过滤器,并且您的查询最终将读取所有分区。
过多分区的成本
分区设计始终伴随着权衡。虽然较小的分区有助于减少查询读取的数据量,但这并不意味着查询会运行得更快。这也会对ingester和compactor工作负载产生副作用。较小的分区通常意味着有更多的、较小的Parquet文件,并会导致
- 存储效率降低——更多的文件需要更多的空间来存储相同的数据。
- 需要更高的ingester工作负载以将数据分组到更小的分区和文件中。
- 需要更高的compactor工作负载以压缩更多的分区和较小的文件。
- 更高的元数据目录体积——更多的分区和更多的文件在查询时需要更多的修剪处理。
- 没有谓词且覆盖整个分区设计的查询最终可能读取许多分区和较小的文件,从而降低性能。
以下是您控制分区数量的方案。
用户控制的分区数量
如果您想控制包含许多城市但每个城市数据量不大的数据集的分区数量,您可以考虑在更长的时范围内对数据进行分区。图3说明了按city_name
和month
进行数据分区的示例。在这种情况下,查询2将从一个分区中读取数据,即Boston | 2025-01
,它涵盖了波士顿整个月的数据。
图3:按city_name和month分区的my_table数据
注意:为特定时间定义保留策略允许您控制数据库中的分区数量。
用户定义的分区数量
目前(2024年1月),InfluxData正在开发名为Server-Side Bucketing
的功能,这将提供一个更简单的方法来设置所需的分区数量。例如,如果您不知道数据集中将有多少个城市,但知道将有很多,您可以通过将许多城市哈希到同一分区来限制分区数量。图4显示了按hash(city_name) % 10
和day
进行数据分区的示例。在这种情况下,一年数据将有最多10 * 365 = 3,650个分区。
图4:按hash(city_name) % 10和day分区的my_table数据
总结
为您的数据找到合适的分区计划有助于提高查询性能,尤其是在高吞吐量摄取案例中。然而,您需要了解数据的性质和规模,以实现正确的设计并确保您系统中没有过多的分区。请记住,避免在可选标签值上对数据进行分区。如果您的数据没有值,InfluxDB将没有足够的信息来应用过滤器,并且您的查询最终将读取所有分区。
有关数据分区在其他方面的作用,请参阅在分片数据库系统中的分区以提高性能。