基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
关于分区表
更新时间:2025-01-17 15:21:21
本文介绍 OceanBase 数据库的分区表。
概述
对于访问数据库的应用而言,逻辑上访问的只有一个表或一个索引,但是实际上这个表可能由数十个物理分区对象组成,每个分区都是一个独立的对象,可以独自处理访问,也可以作为表的一部分处理访问。分区对应用来说是完全透明的,不影响应用的业务逻辑。
从应用程序的角度来看,只存在一个 Schema 对象。访问分区表不需要修改 SQL 语句。分区对于许多不同类型的数据库应用程序非常有用,尤其是那些管理大量数据的应用程序。
分区表可以由一个或多个分区组成,这些分区是单独管理的,可以独立于其他分区运行。表可以是已分区或未分区的,即使已分区表仅由一个分区组成,该表也不同于未分区表,非分区表不能添加分区。
分区表也可以由一个或多个表分区段组成。OceanBase 数据库将每个表分区的数据存储在自己的 SStable 中,每个 SStable 包含表数据的一部分。
优势
提高可用性
分区不可用并不意味着对象不可用。查询优化器自动从查询计划中删除未引用的分区。因此,当分区不可用时,查询不受影响。
更轻松地管理对象
分区对象具有可以集体或单独管理的片段。DDL 语句可以操作分区而不是整个表或索引。因此,可以对重建索引或表等资源密集型任务进行分解。例如,可以一次只移动一个分区。如果出现问题,只需要重做分区移动,而不是表移动。此外,对分区进行
TRUNCATE操作可以避免大量数据被DELETE。减少 OLTP 系统中共享资源的争用
在 TP 场景中,分区可以减少共享资源的争用。例如,DML 分布在许多分区而不是一个表上。
增强数据仓库中的查询性能
在 AP 场景中,分区可以加快即时查询的处理速度。分区键有天然的过滤功能。例如,查询一个季度的销售数据,当销售数据按照销售时间进行分区时,仅仅需要查询一个分区或者几个分区,而不是整个表。
提供更好的负载均衡效果
OceanBase 数据库的存储单位和负载均衡单位都是分区。不同的分区可以存储在不同的节点。因此,一个分区表可以将不同的分区分布在不同的节点,这样可以将一个表的数据比较均匀的分布在整个集群。
增强数据的使用效率。
分区类型
OceanBase 数据库的 MySQL 模式支持多种分区类型:
Range 分区
Range Columns 分区
List 分区
List Columns 分区
Hash 分区
Key 分区
组合分区(二级分区)
Range 分区
Range 分区是最常见的分区类型,通常与日期一起使用。在进行 Range 分区时,数据库根据分区键的值范围将行映射到分区。
Range 分区的分区键仅支持一列,并且只支持 INT 类型。
如果要支持多列的分区键,或者其他数据类型,可以使用 Range Columns 分区。
Range Columns 分区
Range Columns 分区与 Range 分区的作用基本类似,不同之处在于:
Range Columns 分区的分区键的结果不要求是整型,可以是任意类型。
Range Columns 分区的分区键不能使用表达式。
Range Columns 分区的分区键可以写多个列(即列向量)。
List 分区
List 分区使得您可以显式的控制记录行如何映射到分区,具体方法是为每个分区的分区键指定一组离散值列表,这点跟 Range 分区和 Hash 分区都不同。List 分区的优点是可以方便的对无序或无关的数据集进行分区。
List 分区仅支持单分区键,分区键可以是一列,也可以是一个表达式。分区键的数据类型仅支持 INT 类型。
List Columns 分区
如果要使用多列的 List 分区,或者其他数据类型的 List 分区,可以使用 List Columns 分区。
List Columns 分区是 List 分区的一个扩展,支持多个分区键,并且支持 INT 数据、DATE 类型和 DATETIME 类型。
LIST COLUMNS 分区作用跟 LIST 分区基本相同,不同之处在于:
LIST COLUMNS 的拆分列不能是表达式。
LIST COLUMNS 的拆分列可以是多列(即列向量)。
Hash 分区
在进行 Hash 分区时,数据库根据数据库应用于用户指定的分区键的哈希算法将行映射到分区。
行的目标分区是由内部 Hash 函数计算出一个 Hash 值,再根据 Hash 分区个数来确定的。当分区数量为 2 的幂次方时,哈希算法会创建所有分区中大致均匀的行分布。
哈希算法在分区之间均匀分布行,使分区的大小大致相同。
Hash 分区是在节点之间均匀分布数据的理想方法。Hash 分区也是 Range 分区的一种易于使用的替代方法,特别是当要分区的数据不是历史数据或没有明显的分区键的场景。
Hash 分区在具有极高更新冲突的 OLTP 系统里面非常有用。这是因为 Hash 分区将一个表分成几个分区,将一个表的修改分解到不同的分区修改,而不是修改整个表。
Hash 分区键的表达式必须返回 INT 类型。
Key 分区
Key 分区和 Hash 分区类似。主要区别如下:
Hash 分区的分区键可以是用户自定义的表达式,而 Key 分区的分区键只能是列,或者不指定。
key 分区的分区键不限于 INT 类型。
key 分区可以指定或不指定列,也可以指定多个列作为分区键。如果表上有主键,那么这些列必须是表的主键的一部分,或者全部。如果 Key 分区不指定分区键,那么分区键就是主键列。如果没有主键,有 UNIQUE 键,那么分区键就是 UNIQUE 键。
Key 分区与 Hash 分区类似,支持除 TEXT 和 BLOB 之外的所有数据类型的分区。
组合分区(二级分区)
组合分区通常是先使用一种分区策略,然后在子分区再使用另外一种分区策略,适合于业务表的数据量非常大时。使用组合分区能发挥多种分区策略的优点。
在进行组合分区时,表通过一种数据分配方法进行分区,然后使用第二种数据分配方法将每个分区进一步细分为二级分区。因此,组合分区结合了基本的数据分发方法。指定分区的所有二级分区代表数据的逻辑子集。
组合分区有如下优点:
根据 SQL 语句,在一维或二维上进行分区修剪可能会提高性能。
查询可以在任一维度上使用全分区或部分分区连接。
分区的数量大于单层分区,这可能有利于并行执行。
您可以实现一个滚动窗口来支持历史数据,如果许多语句可以从分区修剪或分区连接中受益,则仍然可以在另一个维度上进行分区。
您可以根据分区键的标识以不同方式存储数据。例如,您可能决定以只读的压缩格式存储特定产品类型的数据,并保持其他产品类型的数据不压缩。