有主键和唯一索引键的表应该如何设置分区?

【测试环境】

【 OB 4.2.1.6】
有主键和唯一索引键的表应该如何设置分区?
在不破坏原有表结构的前提下

麻烦告知下表结构和具体的业务需求?

create table test(
id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增主键’,
did varchar(64) DEFAULT NULL COMMENT ‘did’,
uuid varchar(64) DEFAULT NULL COMMENT ‘uid’,
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘更新时间’,
PRIMARY KEY (id),
UNIQUE KEY unique_did_uuid (did,uuid),
KEY I_create_time (create_time),
KEY I_update_time (update_time)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY HASH(id) PARTITIONS 30;

需要保持did 和uuid 的唯一记录

分区的目的就只是为了打散数据到不同节点上是吧?

分区表的分区键一定要被包含在本地唯一索引和主键索引里,所以如果确定了主键是 id 列,分区键就只能是 id 了。

另外这个唯一索引,需要从默认的本地唯一索引改成全局唯一索引。全局索引可以查查官网资料,或者直接看这个: https://oceanbase.yuque.com/org-wiki-obtech-vh7w9r/notes/kfl7ceu8asd0ssrw

所以大概是这样:(当然 global unique index 也可以再指定合适的分区方式,不指定默认就不分区了)


create table test(
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
did varchar(64) DEFAULT NULL COMMENT 'did',
uuid varchar(64) DEFAULT NULL COMMENT 'uid',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY unique_did_uuid (did,uuid) global,
KEY I_create_time (create_time),
KEY I_update_time (update_time)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY HASH(id) PARTITIONS 30;



至于分区方式,需要看真实的业务情况,再决定是 hash、list、range 分区,以及是否需要进行二级分区等等。推荐看下入门教程的第六期,刚好讲了你问的这些东西:OceanBase 社区