tidb v4.0 之前默认统一使用的都是聚簇表嘛?

请问各位老师,tidb v4.0 之前默认全都是 使用聚簇表嘛?

1 个赞

聚簇索引是从 v5.0 开始支持的特性

1 个赞

没有主键的表,都是非聚簇表。聚簇表的要求更高些,不是所有表都能设置为聚簇表。

3 个赞

聚簇表这个功能(table语法中使用clustered)是5.0版本开始有的,但从存储形式上实际在5.0之前就有,仅限于单列bigint主键表。如果开启alter-primary-key的情况下,主键也是一个独立的索引,类似于oralce的堆表+主键索引。5.0版本后的聚簇索引支持非bigint列的主键和单列bigint列主键表的类似存储格式,表中没有了rowid,tikv的key格式也由rowid变成了主键索引列。聚簇索引在使用上会有比较多的限制。

3 个赞

怎么样看到表是以聚簇的形式存储还是以非聚簇的形式存储呢?
mysql> CREATE TABLE t ( a varchar(20) primary key);
Query OK, 0 rows affected (0.51 sec)

mysql> CREATE TABLE t ( a int(20) primary key);
Query OK, 0 rows affected (0.51 sec)

我在4.0.15 版本中,以int 和varchar 字段建立主键都是OK的,但是不知道怎么通过底层去查看是聚簇还是非聚簇?

1 个赞

必然不可能啊,有些表就不是聚簇表,那怎么搞,难道tidb就不支持了?

2 个赞

4.x 中没有聚簇表的概念
但是,4.x 中有聚簇表的表现形式

比如,主键是 bigint, 然后主键索引 也是唯一,不需要以 row_id 的形式表达,少了一项索引开销
然后 主键能满足打散的要求,比如 支持 auto_random的形式,或者 自己采用 snowflake 的算法来生成 id,并且支持 高位换算能满足 打散的一个标准(多tikv 节点 + 多 region)

满足以上两项的情况下,和聚簇表的表现类似,也可以满足高性能的场景