数据库表分区
如果您有下面未解答的问题,请检查并添加到此问题中。
标记 @gitlab-org/database-team/triage,我们会尽快回复您。如果您在 Slack 中得到答案,也请记录在问题中,以便我们将来更新此文档。
表分区是一个强大的数据库功能,允许将表的数据分割成多个充当单个大表的小物理表。如果应用程序在设计时就考虑了分区功能,可能会有多种好处,例如:
-
查询性能可以大大提高,因为数据库可以低成本地从搜索空间中排除大量数据,同时仍提供完整的 SQL 功能。
-
通过删除整个分区,可以实现批量删除,而对数据库的影响最小。这非常适合需要定期删除超出保留窗口的数据的功能。
-
像
VACUUM和索引重建这样的管理任务可以在单个分区上操作,而不是在单个巨大的表上操作。
不幸的是,并非所有模型都适合分区方案,如果实现不当,会有显著的缺点。此外,表只能在创建时进行分区,这使得对繁忙的数据库应用分区变得相当复杂。有一套迁移工具可供后端开发人员使用,以对现有表进行分区,但迁移过程相当繁琐,需要跨越多个版本的多个步骤。由于分区和相关迁移的限制,在尝试利用此功能之前,您应该了解分区如何适合您的用例。
分区迁移助手通过创建原始表的分区副本,并使用触发器和后台迁移的组合将数据复制到新表中工作。对原始表架构的更改可以与分区迁移并行进行,但必须注意不要破坏使迁移工作的底层机制。例如,如果向正在分区的表中添加列,则分区表和触发器定义都必须更新以保持一致。
确定何时使用分区
虽然正确应用分区时非常有用,但必须确定表的数据和工作量是否自然适合分区方案。了解一些细节,以确定分区是否适合您的特定问题:
-
表分区。表基于分区键进行分区,分区键是一个或多个列,决定了数据如何在分区之间分割。数据库在读取或写入数据时使用分区键,以决定必须访问哪些分区。分区键应该是几乎所有访问该表的查询的
WHERE子句中都会包含的列。 -
数据如何分割。数据库使用什么策略在分区之间分割数据?
确定合适的分区策略
可用的分区策略选择有 date range(日期范围)、int range(整数范围)、hash(哈希)和 list(列表)。