分区键和主键、索引的关系

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】一直没搞清楚分区键和主键、索引的关系
【复现路径】问题出现前后相关操作

2 个赞

局部索引根据分区键划分为局部前缀索引和局部非前缀索引。

MySQL 模式默认创建的是局部索引。Oracle 模式默认创建的是全局索引,且索引表只有一个分区。

l 局部前缀索引:分区键是索引的左前缀,并且索引包含二级分区键。局部前缀索引可以是唯一索引或者非唯一索引。唯一索引必

须包括表分区函数中的所有列。

指定索引键的查询利用局部前缀索引可以唯一定位到一个索引分区,非常适合于结果集比较小,但是需要进行分区裁剪的

场合。

例如,表 A 上有个局部索引 idx(c1,c2,c3) ,主表根据 c1 进行分区,由于索引表和主表的分区方式一样, idx 也以 c1 为

分区键,当处理指定索引键的查询时,可以通过分区键 c1 的值定位到唯一一个索引分区,大大减少了索引分区的访问。

l 局部非前缀索引:如果索引表不是局部前缀索引,那就是局部非前缀索引。可能的情况是,索引表的分区键不是索引的左前缀,

或者索引没有包含二级分区键。

如果分区键不是索引的子集,那么局部非前缀索引不能是唯一索引。

指定索引键的查询利用局部非前缀索引,需要访问所有索引分区,因此比较适合访问数据量比较大,注重并发的场景。

例如,表 A 上有个局部索引 idx(c1,c2,c3) ,主表根据 c4 列进行分区,当用户查询指定索引键时,不能通过分区键定位到

索引分区,因此需要访问所有的索引分区才能获得结果。

OceanBase 数据库主要涉及如下索引类型:

局部分区索引:在创建索引时指定关键字 LOCAL 的索引为局部索引,局部索引无须指定分区规则,它的分区属

性和主表的属性一致,也会跟随主表的分区操作而发生变更。

全局索引:在创建索引时指定关键字 GLOBAL 的索引为全局索引,全局索引可以按照与主表不一样的分区规则

进行分区。但如果主表没有必要进行分区,通常来说全局索引也就没有必要做分区。

唯一索引:索引键值具有唯一性,用关键字 UNIQUE 表示。

前缀索引:当分区索引表的分区键是索引列的左前缀时,该索引称为前缀索引。这不同于MySQL 长字符串的前

缀索引。例如,索引表 idx 建立在 c1 和 c2 列上,如果该索引表的分区键为 c1 ,那么该索引称为前缀索引;如

果该索引表的分区键为 c2 或者其他列,则称为非前缀索引。

非前缀索引:相对于分区前缀索引而言,如果分区索引不是前缀索引,那么称为非前缀索引。

分区表索引-局部索引

局部索引根据分区键划分为局部前缀索引和局部非前缀索引。

MySQL 模式默认创建的是局部索引。Oracle 模式默认创建的是全局索引,且索引表只有一个分区。

局部前缀索引:分区键是索引的左前缀,并且索引包含二级分区键。局部前缀索引可以是唯一索引或者非唯一索引。唯一索引必

须包括表分区函数中的所有列。

Ø 指定索引键的查询利用局部前缀索引可以唯一定位到一个索引分区,非常适合于结果集比较小,但是需要进行分区裁剪的

场合。

Ø 例如,表 A 上有个局部索引 idx(c1,c2,c3) ,主表根据 c1 进行分区,由于索引表和主表的分区方式一样, idx 也以 c1 为

分区键,当处理指定索引键的查询时,可以通过分区键 c1 的值定位到唯一一个索引分区,大大减少了索引分区的访问。

局部非前缀索引:如果索引表不是局部前缀索引,那就是局部非前缀索引。可能的情况是,索引表的分区键不是索引的左前缀,

或者索引没有包含二级分区键。

Ø 如果分区键不是索引的子集,那么局部非前缀索引不能是唯一索引。

Ø 指定索引键的查询利用局部非前缀索引,需要访问所有索引分区,因此比较适合访问数据量比较大,注重并发的场景。

Ø 例如,表 A 上有个局部索引 idx(c1,c2,c3) ,主表根据 c4 列进行分区,当用户查询指定索引键时,不能通过分区键定位到

索引分区,因此需要访问所有的索引分区才能获得结果。

1 个赞

谢谢