news 2026/4/24 9:52:38

【赵渝强老师】OceanBase的分区表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【赵渝强老师】OceanBase的分区表

OceanBase当前支持的类型包括Range分区、Range COLUMNS分区、List分区、List COLUMNS分区、Hash分区和Key分区等,其中:

  • Range分区、Range COLUMNS分区、List分区和List COLUMNS分区可以用于解决业务中大量删除带来的性能问题,支持快速删除分区。
  • Hash分区和Key分区可以用于大量写入场景下的数据打散。与Hash分区相比,Key分区支持多列打散和非整数类型字段的打散。
视频讲解如下

【赵渝强老师】OceanBase的分区表

下面分别介绍这几种分区表。

一、 Range分区

一个表按Range分区是指,对于表的每个分区中包含的所有行,按分区表达式计算的值都落在给定的范围内。Range必须是连续的,并且不能有重叠,通过使用VALUES LESS THAN进行定义。下面通过一个示例来进行演示。
(1)创建一张新的员工表,按照薪水建立Ranger分区。

ob>createtableemp_range(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbyrange(sal)(partitionp0valuesless than(1000),partitionp1valuesless than(3000),partitionp2valuesless than maxvalue);

(2)往表中插入数据。

ob>insertintoemp_rangeselect*fromemp;

(3)查询薪水在2000~2500之间的员工,并查看执行计划。

ob>explainselect*fromemp_rangewheresalbetween2000and2500;# 提示:从执行计划可以看出,本次查询只扫描分区p1。

二、 Range COLUMNS分区

Range COLUMNS分区是Range分区的一种变体。可以使用一个或者多个列作为分区键,分区列的数据类型可以是整数(integer)、字符串(CHAR/VARCHAR),DATE和DATETIME。不支持使用任何表达式。和Range分区一样,Range COLUMNS分区同样需要分区的范围是严格递增的。下面通过一个示例来进行演示。
(1)创建一张新的员工表,按照职位和薪水建立Range COLUMNS分区。

ob>createtableemp_range_column(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbyrangecolumns(job,sal)(partitionp0valuesless than('CLERK',1000),partitionp1valuesless than('CLERK',3000),partitionp2valuesless than('CLERK',maxvalue),partitionp3valuesless than('SALESMAN',1000),partitionp4valuesless than('SALESMAN',3000),partitionp5valuesless than('SALESMAN',maxvalue));

(2)往表中插入数据。

ob>insertintoemp_range_columnselect*fromemp;

(3)查询职位是CLERK,且薪水小于2500之间的员工,并查看执行计划。

ob>explainselect*fromemp_rangewherejob='CLERK'andsal<2500;# 提示:从执行计划可以看出,本次查询只扫描分区p0和p1。

三、 List分区

List分区和Range分区有很多相似的地方。不同之处主要在于List分区中,对于表的每个分区中包含的所有行,按分区表达式计算的值属于给定的数据集合。每个分区定义的数据集合有任意个值,但不能有重复的值。下面通过一个示例来进行演示。
(1)创建一张新的员工表,按照部门号建立List分区。

ob>createtableemp_list(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbylist(deptno)(PARTITIONp0VALUESIN(10,20),PARTITIONp1VALUESIN(30),PARTITIONp2VALUESIN(default));

(2)往表中插入数据。

ob>insertintoemp_listselect*fromemp;

(3)查询40号部门的员工,并查看执行计划。

ob>explainselect*fromemp_listwheredeptno=30;# 提示:从执行计划可以看出,本次查询只扫描分区p1。


四、 List COLUMNS分区

List COLUMNS分区是List分区的一种变体,可以将多个列用作分区键,并且可以将整数类型以外的数据类型的列用作分区列。该分区还可以使用字符串类型、DATE和DATETIME类型的列。下面通过一个示例来进行演示。
(1)创建一张新的员工表,按照薪水建立Range INTERVAL分区。

ob>createtableemp_list_columns(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbylistcolumns(job)(PARTITIONp0VALUESIN('MANAGER'),PARTITIONp1VALUESIN('CLERK'),PARTITIONp2VALUESIN('SALESMAN'),PARTITIONp3VALUESIN('ANALYST'),PARTITIONp4VALUESIN('PRESIDENT'));

(2)查看表上的分区信息。

ob>showcreatetableemp_list_columns \G;# 输出的信息如下:***************************1.row***************************Table: emp_list_columnsCreateTable:CREATETABLE`emp_list_columns`(`empno`int(11)DEFAULTNULL,`ename`varchar(10)DEFAULTNULL,`job`varchar(10)DEFAULTNULL,`mgr`int(11)DEFAULTNULL,`hiredate`varchar(10)DEFAULTNULL,`sal`int(11)DEFAULTNULL,`comm`int(11)DEFAULTNULL,`deptno`int(11)DEFAULTNULL)ORGANIZATIONINDEXDEFAULTCHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMPRESSION='zstd_1.3.8'REPLICA_NUM=1BLOCK_SIZE=16384USE_BLOOM_FILTER=FALSEENABLE_MACRO_BLOCK_BLOOM_FILTER=FALSETABLET_SIZE=134217728PCTFREE=0partitionbylistcolumns(job)(partition`p3`valuesin('ANALYST'),partition`p1`valuesin('CLERK'),partition`p0`valuesin('MANAGER'),partition`p4`valuesin('PRESIDENT'),partition`p2`valuesin('SALESMAN'))1rowinset(0.035sec)

五、 Hash分区

Hash分区会根据数据的Hash值建立分区,如果数据的Hash值一样,那么数据将会放入同一个分区中。Hash分区主要用于保证数据均匀地分散到一定数量的分区里面。下图解释了Hash分区的原理。

下面的语句将创建一张新的员工表,按照经理号(mgr)建立4个Hash分区。

ob>createtableemp_hash_by_mgr(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbyhash(mgr)partitions4;# 提示:如果不指定partitions 4,默认的分区数量为 1。

六、 Key分区

Key分区与Hash分区都可以保证将数据均匀地分散到一定数量的分区里面,区别是Hash分区只能根据一个指定的整数表达式或字段进行分区,而Key分区可以根据字段列表进行分区,且Key分区的分区字段不局限于整数类型。创建Key分区表时,你需要在CREATE TABLE后面添加PARTITION BY KEY(columnList),其中columnList是字段列表,可以包含一个或多个字段。每个字段的类型可以是除BLOB、JSON、GEOMETRY之外的任意类型(请注意TiDB不支持GEOMETRY类型)。此外,你很可能还需要加上PARTITIONS num,其中num是一个正整数,表示将表划分多少个分区。下面的语句将创建一个Key分区表,按员工的职位job分成4个分区:

ob>createtableemp_hash_by_job(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbykey(job)partitions4;

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 3:44:58

嵌入式单片机/STM32模块开源代码地图

GitHub 网址&#xff1a;https://github.com/ 当需要找模板时&#xff0c;可以这样搜索&#xff1a;芯片平台 模块名 关键词&#xff08;driver/library/embeded&#xff09; 例如&#xff1a; 找 OLED 驱动&#xff1a;stm32 oled i2c driver 找震动电机&#xff1a;vibra…

作者头像 李华
网站建设 2026/4/17 3:43:11

远程开发团队晋升密码:软件测试从业者影响力构建手册

在数字世界中重塑你的价值坐标在远程与分布式工作模式成为软件研发新常态的今天&#xff0c;物理工位的消失并未削弱职场竞争的激烈程度&#xff0c;反而让衡量价值的标尺发生了根本性的转变。对于软件测试从业者而言&#xff0c;传统的“勤奋执行者”形象已不足以支撑其在虚拟…

作者头像 李华
网站建设 2026/4/17 3:42:14

Claude Code新手实战:我是怎么蒸馏出“叶金荣“Skill的

用了一段时间Claude Code&#xff08;简称CC&#xff09;&#xff0c;发现它最强的能力之一就是Skill。下面这几点是我从完全不会到能自己创建Skill的真实经验&#xff0c;分享给刚上路的朋友。1. 不知道怎么用某个Skill&#xff1f;直接问CC当你看到一个Skill&#xff0c;但完…

作者头像 李华
网站建设 2026/4/17 3:38:22

手把手教你学Simulink——基于Simulink的三端口隔离型DC-DC变换器能量管理

目录 手把手教你学Simulink——基于Simulink的三端口隔离型DC-DC变换器能量管理​ 摘要​ 一、背景与挑战​ 1.1 微电网与多源系统的“木桶效应”​ 1.2 三有源桥(TAB):一台顶三台的“能量立交桥”​ 1.3 破局痛点与设计目标​ 二、系统架构与核心控制推导​ 2.1 整体…

作者头像 李华
网站建设 2026/4/17 3:33:13

FPGA性能基准测试:三层方法论与工程实践

1. FPGA性能基准测试的核心价值与挑战在数字电路设计领域&#xff0c;FPGA因其可重构性和并行处理能力已成为关键器件。但不同厂商、不同系列的FPGA在实际性能表现上存在显著差异&#xff0c;这使得性能基准测试成为选型决策的重要依据。我曾参与过多个采用不同FPGA平台的项目&…

作者头像 李华