Skip to content

表分区

概述

表分区是将单个大表分割成更小、更可管理的部分的一种技术。在分区表中,数据根据指定的列(分区键)值被分成不同的分区。每个分区都是独立的,并且可以单独管理,包括备份和恢复、维护索引、查询等。

以下是使用表分区的一些优点:

  • 提高查询性能:查询可以只访问与查询条件相关的分区,从而减少扫描的数据量。当查询条件包括分区键时,查询性能可以得到极大的提高。
  • 更好的数据管理:表分区可以使数据更加可管理。例如,分区可以根据时间、地理位置或其他相关列来分割数据,使得数据备份和恢复更容易、更高效。
  • 更好的数据可用性:当某个分区出现故障时,只有该分区受到影响,而其他分区的数据仍然可用。这提高了系统的可用性和容错性。
  • 更好的维护:使用表分区可以让数据库管理员更轻松地对数据进行维护。例如,可以对特定的分区进行备份或重建索引,而不会对整个表产生影响。

总之,表分区是一种非常有用的技术,可以使数据更加可管理、可维护,并且可以提高查询性能和数据可用性。

织信支持对数据表开启表分区功能,织信会自动根据表分区策略将源数据表拆分成分区表。数据写入时会根据分区策略写入的不同的分区表中。

表分区策略

  • 范围分区(Range Partitioning)

    按照分区键的连续范围将数据分成多个分区,每个分区包含分区键的一个范围。范围分区通常用于处理按时间或数字范围进行分区的数据。例如,一个按时间分区的表可以将每个月的数据放在一个分区中。

  • 列分区(List Partitioning)

    按照分区键的离散值列表将数据分成多个分区,每个分区包含分区键的一个值列表。列分区通常用于处理具有明确定义值集的数据。例如,一个按地区分区的表可以将数据分成不同的分区,每个分区代表一个地区。

  • 哈希分区(Hash Partitioning)

    按照分区键的哈希值将数据分成多个分区,每个分区具有相似的行数和数据大小。哈希分区通常用于随机访问的工作负载,因为它可以将数据均匀分布到多个分区中。

使用多列分区时需要确保子表中的数据只能符合一种可能的分区情况。因此,对于多列分区,每个子表的条件需要涵盖所有列,并且不能出现交叉条件。

注意事项

使用表分区可以为数据库应用带来很多好处,但在使用过程中需要注意以下几点:

  • 分区键的选择

    选择正确的分区键很重要,因为它会直接影响到数据的分布和查询性能。分区键应该是常用的查询条件之一,并且应该均匀分布在不同的分区中。

  • 分区数量的选择

    分区数量的选择取决于数据量、硬件配置和应用需求等因素。通常情况下,分区数量应该根据数据的增长率和查询需求进行动态调整。

  • 索引的选择

    在使用表分区时,索引也需要进行分区。通常情况下,需要在分区表中为每个分区单独创建索引,以提高查询性能。

  • 备份和恢复

    备份和恢复分区表需要一些额外的步骤。需要备份每个分区的数据,并在恢复时逐个分区地恢复数据。

  • 数据迁移

    在表分区的场景中,需要特别注意数据的迁移。迁移数据时需要考虑分区的情况,避免将数据放置到错误的分区中,或者出现数据重复或丢失的情况。

总之,在使用表分区时需要注意上述几点,避免出现问题并最大化发挥表分区的优点。

普通表和分区表互相转换

开启表分区功能后,织信会自动的创建一张分区表(partition table)并且根据设置的分区策略生成分区表,在发布应用后,织信会将普通表的数据自动的插入到分区表中,之后会删除普通表。关闭分区功能的过程和创建的过程相反。通常情况下只有在数据表数据量很大的情况下才需要开启分区功能,自动插入到分区表的初始化过程会比较缓慢。

表分区的例子

 +------------+
   |  mytable   |
   +------------+
   | id         |
   | created_at |
   | value      |
   +------------+
          |
          | PARTITION BY RANGE (created_at)
          v
+-----------------+    +-----------------+    +-----------------+
| mytable_2019_p1 |    | mytable_2020_p1 |    | mytable_2021_p1 |
+-----------------+    +-----------------+    +-----------------+
| id              |    | id              |    | id              |
| created_at      |    | created_at      |    | created_at      |
| value           |    | value           |    | value           |
+-----------------+    +-----------------+    +-----------------+

在上面的示例中,mytable 表按照 created_at 字段进行分区,共分为 3 个分区:mytable_2019_p1、mytable_2020_p1、 和 mytable_2021_p1。每个分区按照时间范围进行分割,数据被插入到分区表中时,会根据 created_at 字段的值被自动路由到相应的分区中。这样可以提高查询性能,并且使数据管理更加灵活和高效。

按照范围区间分区

日期类型的值格式为'yyyy-MM-dd',字符串类型的值格式为'value',数字类型的格式为1

日期分区示例:

按照值分区

字符串类型的值格式为'value',数字类型的格式为1,多个值用,隔开

按照HASH分区

哈希分区基于分区键的哈希值计算数据所在的分区

以10为模数,建立10个分区示例:

text
哈希余数0
哈希余数1
哈希余数2
哈希余数3
哈希余数4
哈希余数5
哈希余数6
哈希余数7
哈希余数8
哈希余数9