请教一个本地分区计算相关的问题

【 使用环境 】生产环境
【 OB or 其他组件 】oceanbase for mysql
【 使用版本 】oceanbase:3.2.3.2 oceanbase-client: 2.4.3
【问题描述】

假设我有一张表A partition by key (a,b)

我想在不连接数据库的情况下,在应用进程中根据a、b计算出当前数据存放在(或即将存放在)哪个分区。

请问有没有什么方式?

感谢

1 个赞

计算分区键的散列值,然后使用模运算(% )来确定数据属于哪个分区。具体来说,分区编号是通过hash_value % number_of_partitions计算得出的。

1 个赞

感谢您的解答

但是,原理好理解。 Oceanbase实际是怎么计算这个hash值的呢。在有两个分区键的情况下,如何计算这个hash值呢。

您好

我的分区用的不是hash(), 是key()

key分区跟hash分区类似,也是通过对分区个数取模的方式来确定数据属于哪个分区。不同的是系统会对key分区键做一个内部默认默认的hash函数后再取模。

所以用户通常没有办法自己通过简单的计算来得知某一行属于哪个分区。

举个例子

create table t1 (c1 int, c2 int) partition by key(c1) partitions 5

OceanBase的hash函数

对于非字符串类型,直接使用murmur hash。对于字符串类型,例如archer和char类型。key分区使用的是MySQL的hash函数。这里主要是和字符串的collation相关,例如在某些collation里面大小写是相等的。例如’A’ = ‘a’,所以要求’A’和’a’计算的hash值需要一样。所以不能直接用murmurhash。必须使用MySQL的函数。这种情况我们测试发现MySQL的key分区的hash函数不太均匀。

  1. key分区不要求是int类型,可以是任意类型

  2. key分区不能写表达式

  3. key分区支持向量

  4. key分区有一个特殊的语法

create table t1 (c1 int primary key, c2 int) partition by key() partitions 5

key分区list不写任何column,表示key分区的列是主键。

hash和key分区的对比

  1. hash分区可以写表达式, key分区不行

感谢解答

原理好理解

我想知道具体的计算hash值的方式是什么

我希望能在应用进程中根据分区键直接定位到具体的分区。

比如分区键是 a,b , 表分了128个分区(p0,p1,……p127)。当我在业务处理中得到a=‘123’, b='abc’时,在不连接数据库的情况下在进程中计算出a=‘123’, b=‘abc’ 应该被分到p0,p1,……p127中的哪一个。

这有一篇关于mysql的key hash值的算法 你可以参考 你也可以看ob的源码 在github上有
http://mysql.taobao.org/monthly/2015/01/06/