请问从MySQL迁移过来的场景,建表建议使用聚簇表还是非聚簇表,各有啥优缺点吗

【 TiDB 使用环境】测试/ Poc
【 TiDB 版本】7.5.1
TiDB默认创建表使用的聚簇表。 如果从MySQL迁移过来的,建议使用非聚簇表;如果是新表,建议使用聚簇表,是这样理解吗

https://docs.pingcap.com/zh/tidb/stable/clustered-indexes
这个有介绍

2 个赞

看业务需求,跟是不是mysql迁移过来的关系不大

1 个赞

一般看需求

1 个赞

这个跟你原表结构和业务情况有关。不过可以的话,建议还是使用聚簇索引表。

1 个赞

这个文档有对比,很详细
https://docs.pingcap.com/zh/tidb/stable/dm-best-practices

2 个赞

我们迁移过来的都是聚簇表。 默认也是聚簇表吧。 聚簇表的特性是有顺序,似乎对key-value有优势

1 个赞

聚簇表在tidb底层存储用的key-value形式,key是表id+主键值,这样就可以少建一个主键索引。

优点:对写入性能要求高的场景,聚簇表比非聚簇表+主键索引建的表写入性能高很多。udpate数据where带主键也比非聚簇表快。

MySQL本身也是聚簇表,迁移过来也是建议用聚簇表。非聚簇表目前看基本没有什么意义,tidb默认也不用了

建议聚簇表

学习了

还是需要看业务的需求吧,一般建议能建聚簇表就建聚簇表

假如迁过来的表是有主键ID+自增属性的,主键而且还有业务属性。如果有写热点的问题,该如何解决呢

假如迁过来的表是有主键ID+自增属性的,主键而且还有业务属性。如果有写热点的问题,这个解法吗

迁过来已经是聚簇表了吗?如果是非聚簇表的话,可以使用SHARD_ROW_ID_BITS相关参数来进行打散,从而缓解写热点问题。

1 个赞

对,就是想用聚簇表。这个场景下要解决写热点问题的话,貌似数据库层面没什么太好的方法吧

聚簇表,主键自增,不能换成auto_random的话,写热点避免不了的。。。因为他的key(RowID)都是tablePrefix{ TablelD }_recordPrefixSep{ Col1 },这样key顺序增加,只能放在一个region里面,无法打散的

1 个赞

对已经给存在数据的表,能直接把AUTO_INCREMENT改为AUTO_RANDOM吗

可以的

1 个赞

明白了,谢谢~

要和mysql自增行为一致,需要建表时候加上 AUTO_ID_CACHE=1参数。
热点遇到再说,我测试nvme硬盘上影响不大