文档如下:
auto_random在4.0.3时成为正式功能,但是4.0.3应该还没有clustered主键,也就是说在4.0版本是不支持使用auto_random?
升级一下版本就好拉,不光修复了很多bug,而且多了一些稳定特性不香么~
非聚簇表bigint的主键是独立于表的,类似于oracle的堆表和主键,rowid是系统自动生成。聚簇表是主键和表在一起,和mysql一样,tidb聚簇表出现前只支持主键是int类型的’聚簇表’,聚簇表出现后支持其他数据类型
看起来文档是有误?
没问题,不同的版本选不同版本的文档就行。
先理解聚簇表 、非聚簇表的的表和索引存储格式,再理解auto_random的要求,这个问题就理解了
–,问题是为什么4.0没有非聚簇索引可以使用auto_random,到了6.0反而不行?
4.0没有聚簇索引
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生成的算法,两者之间有关联?
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表
你需要先理解的内容
1、 tidb region \ key 格式,可以看官网 说计算这篇文章
2、 聚簇表 非聚簇表的存储格式差异,建议可以了解下oracle的堆表和IOT表来对比
3、对比下4.0的bigint 主键 存储格式和 bigint的聚簇表格式是否有差异