当主键类型为nonclustered时,不支持auto_random?

文档如下:


auto_random在4.0.3时成为正式功能,但是4.0.3应该还没有clustered主键,也就是说在4.0版本是不支持使用auto_random?

4.0支持的,只是4.0还没有聚簇索引表的概念
https://docs.pingcap.com/zh/tidb/v4.0/troubleshoot-hot-spot-issues

升级一下版本就好拉,不光修复了很多bug,而且多了一些稳定特性不香么~

非聚簇表bigint的主键是独立于表的,类似于oracle的堆表和主键,rowid是系统自动生成。聚簇表是主键和表在一起,和mysql一样,tidb聚簇表出现前只支持主键是int类型的’聚簇表’,聚簇表出现后支持其他数据类型

看起来文档是有误?

没问题,不同的版本选不同版本的文档就行。

先理解聚簇表 、非聚簇表的的表和索引存储格式,再理解auto_random的要求,这个问题就理解了

–,问题是为什么4.0没有非聚簇索引可以使用auto_random,到了6.0反而不行?

4.0没有聚簇索引

  1. auto random要求是bigint主键
  2. 4.0没有聚簇索引的概念,但实际bigint主键的表就是索引
  3. 引入聚簇索引概念后,bigint主键的表指定nonclustered那么主键索引和表就是2个独立对象,指定为clustered那就是聚簇索引主键索引和表是一个

auto_random跟noncluster和cluster有什么关系?

如果6.0使用noncluster那么行为应该和4.0一样?

关系就是你截图看看那段话,你能理解mysql上聚簇索引的结构吗

我理解的是auto_random是id生成的算法,其实id类型设置为int和bigint都可以,但是根据auto_random生成的id是随机的通常很大,如果使用int类型可能会超过其上限,所以建议是都是用bigint类型;

但是这个跟表是noncluster和cluster有什么关系,为什么6.0 noncluster就不能设置auto_random?

一个是表属性,一个是id生成的算法,两者之间有关联?

noncluster就是多了一个索引,4.0存储的应该都是noncluster?

1、 要求bigint确实和范围有关
2、 按照一般理解说,auto_random就是生成个随机数,和是否cluster无关,但是tidb中数据范围是按照key range来划分的region 。key的格式是 t_(table_id)r(rowid) ,如果是int类型的主键 那么主键就rowid,如果不是int类型主键或noncluster表,那么rowid就是系统自动分配的一个递增值。auto_random的目的是通过产生随机数将数据写入到不同的region范围内,如果是noncluster表或非int主键变,由于rowid是递增值而不是auto_random的随机值,这也即便auto_random产生的是随机的,但实际数据写入时永远都是最后一个region, 就是热点

多谢多谢,有点思路

但还有一个问题是4.0使用auto_random是怎么实现热点打散?还是说4.0的noncluster存储格式和6.0不一样?

auto_random实现都是一样的,4.0中没有聚簇索引一说,引入cluster后非int列也能设置为cluster表

文档说是4.0.3成为正式功能,难道4.0.3就开始有cluster 表功能?

你需要先理解的内容
1、 tidb region \ key 格式,可以看官网 说计算这篇文章
2、 聚簇表 非聚簇表的存储格式差异,建议可以了解下oracle的堆表和IOT表来对比
3、对比下4.0的bigint 主键 存储格式和 bigint的聚簇表格式是否有差异

你是对的,那就是4.0主键如果设置为整形类型表就是cluster,其它类型就是noncluster

到了5.0之后,可以设置其它类型的cluster表了