Help us learn about your current experience with the documentation. Take the survey.

数据库表分区

如果您有下面未解答的问题,请检查并添加到此问题中。 标记 @gitlab-org/database-team/triage,我们会尽快回复您。如果您在 Slack 中得到答案,也请记录在问题中,以便我们将来更新此文档。

表分区是一个强大的数据库功能,允许将表的数据分割成多个充当单个大表的小物理表。如果应用程序在设计时就考虑了分区功能,可能会有多种好处,例如:

  • 查询性能可以大大提高,因为数据库可以低成本地从搜索空间中排除大量数据,同时仍提供完整的 SQL 功能。

  • 通过删除整个分区,可以实现批量删除,而对数据库的影响最小。这非常适合需要定期删除超出保留窗口的数据的功能。

  • VACUUM 和索引重建这样的管理任务可以在单个分区上操作,而不是在单个巨大的表上操作。

不幸的是,并非所有模型都适合分区方案,如果实现不当,会有显著的缺点。此外,表只能在创建时进行分区,这使得对繁忙的数据库应用分区变得相当复杂。有一套迁移工具可供后端开发人员使用,以对现有表进行分区,但迁移过程相当繁琐,需要跨越多个版本的多个步骤。由于分区和相关迁移的限制,在尝试利用此功能之前,您应该了解分区如何适合您的用例。

分区迁移助手通过创建原始表的分区副本,并使用触发器和后台迁移的组合将数据复制到新表中工作。对原始表架构的更改可以与分区迁移并行进行,但必须注意不要破坏使迁移工作的底层机制。例如,如果向正在分区的表中添加列,则分区表和触发器定义都必须更新以保持一致。

确定何时使用分区

虽然正确应用分区时非常有用,但必须确定表的数据和工作量是否自然适合分区方案。了解一些细节,以确定分区是否适合您的特定问题:

  • 表分区。表基于分区键进行分区,分区键是一个或多个列,决定了数据如何在分区之间分割。数据库在读取或写入数据时使用分区键,以决定必须访问哪些分区。分区键应该是几乎所有访问该表的查询的 WHERE 子句中都会包含的列。

  • 数据如何分割。数据库使用什么策略在分区之间分割数据?

确定合适的分区策略

可用的分区策略选择有 date range(日期范围)、int range(整数范围)、hash(哈希)和 list(列表)。