为什么主键必须包含全部分区键?


在官方这个案例中,主键插入了重复值1,但是如果主键只有c1,那个是无法重复值的

obclient [testdb]> create table t1 (c1 int,c2 int, c3 int, primary key (c1));
Query OK, 0 rows affected (0.069 sec)

obclient [testdb]> insert into t1 values(1,2,3);
Query OK, 1 row affected (0.008 sec)

obclient [testdb]> insert into t1 values(1,2,3);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
obclient [testdb]> insert into t1 values(1,4,5);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
obclient [testdb]> 

我感觉这个案例不具有说服力,你们是如何理解的?

@论坛小助手

在 OceanBase 数据库中,如果创建的是分区表,为了确保查询的高效性,主键必须包含全部的分区键。这是因为分区键决定了数据如何分布在不同的分区中,如果主键不包含分区键,那么在进行主键查询时,系统无法直接定位到特定的分区,而可能需要扫描多个分区,这会严重影响查询性能。

在官方的案例中,创建了一个分区表 t1,其中 c1c2 组成主键,而 c2 是分区键。这是因为分区键 c2 确定了数据的分布,而主键 c1c2 的组合确保了每一行数据的唯一性。即使 c1 可以重复,但 c1c2 的组合仍然保证了唯一性。

例如:

create table t1(c1 int, c2 int, c3 int, primary key (c1, c2))
partition by range (c2)
(partition p0 values less than(3),
partition p1 values less than(6));

在这个例子中,c1c2 的组合确保了主键的唯一性,同时 c2 作为分区键决定了数据的分布。这样,即使 c1 有重复值,但由于 c2 的不同,每一条记录仍然是唯一的。

如果你只使用 c1 作为主键,而不包含 c2,那么在进行主键查询时,系统无法直接定位到特定的分区,可能需要扫描多个分区,这会严重影响查询性能。因此,为了确保查询的高效性和数据的唯一性,主键必须包含全部的分区键。

检索到的文档如下:

  1. 索引概述
  2. 主键表和无主键表
  3. 分区概述
  4. 数据分布
  5. 使用 MySQL 租户做常见数据库开发
  6. 使用 OceanBase 数据库分区表进行水平拆分
1 个赞

如果主键唯一,那么分区键不是也唯一了吗

这里说的是分区键必须是主键的子集,没有说主键唯一分区键一定是唯一的,如果分区键是主键的子集,那么分区键字段加上主键中其它字段这个从全局上肯定是唯一,因为主键的定义上确保一定是唯一的

OceanBase的表是索引组织表,数据物理存储顺序由主键决定。分区键作为数据分布的依据,必须是主键的子集,才能确保通过主键快速定位数据所在的分区

学习下,还是的考虑性能